ツイッターのようなタイムラインを表示させたい
Firebaseのデータ取得の処理は非同期処理なのでツイッターのタイムラインのように画像とデータベースのデータを特定の順番で表示させる場合、何も考えずに表示させると画像がずれたりするため再帰的にデータを取得させに行く方法がおすすめです。
java.Timeline.java
public class Timeline extends AppCompatActivity{
//取ってきたデータベースのデータを入れるList
private ArrayList<String> getDate = new ArrayList<>();
//画像の参照取得
private ArrayList<StorageReference> spaceRef = new ArrayList<>();
//DatabaseReferenceオブジェクト作成
private DatabaseReference mDatabase;
//FireBaseストレージ
private FirebaseStorage storage = FirebaseStorage.getInstance();
//ストレージ
private StorageReference storageRef = storage.getReference();
//カウント変数
private int Count = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
//Databaseへの参照取得
mDatabase = FirebaseDatabase.getInstance().getReference();
//FireBaseのイベント
mDatabase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
//取りたいデータ
Object getObject = postSnapshot.child(/*取りたいデータ*/).getValue();
//取得データのnullチェック
if(getObject != null) {
//リストに格納
getDate.add(getObject .toString());
//画像の参照取得
spaceRef.add(storageRef.child(/*参照画像*/));
//取りに行きたい画像の処理
getPhoto();
}
}
}
//画像取得
private void getPhoto() {
int Listsize = spaceRef.size();
//リスト外を見るのを回避
if(Count < Listsize) {
final long ONE_MEGABYTE = 1024 * 1024;
//ストレージイベント
spaceRef.get(Count).getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
//サムネイル画像取得
Bitmap bit = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
/*リストビューに追加する処理を入れる*/
Count++;
getPhoto();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception exception) {
}
});
}
}
オリジナルのリストビュー作成済みで、あと一歩のところで躓いてる人向けに書いたのでかなり適当ですが(実際に使っている処理は参考にならないと思われます)、一先ず自分はこれでなんとかできました。
あと、javaなのでnullチェックはしっかりしたほうが個人的にはいい気がします。
友人がGithubで公開したのでリンクを乗せておきます。StutdentTimeline.javaとTeacherStudent.javaがこの方法を実際に使っています。
https://github.com/wasabimochi/ivycon
気が向いたときにしっかり綺麗に書いて投稿しようと思います(するとは言ってない)。
質問があればコメントください。
ではまた。