LoginSignup
2
3

More than 5 years have passed since last update.

FireBaseをつかってTwitterのようなタイムラインを表示させたい

Last updated at Posted at 2018-10-18

ツイッターのようなタイムラインを表示させたい

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
気が向いたときにしっかり綺麗に書いて投稿しようと思います(するとは言ってない)。
質問があればコメントください。
ではまた。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3