如何取得文件编号?Firestore分页 [英] How to get Documents Id ? Firestore Paginate

查看:58
本文介绍了如何取得文件编号?Firestore分页的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在使用 Firebase Firestore数据库,我正在尝试使用此Stackoverflow ans和

I am using Firebase Firestore Database, I am trying to load data using dual query for pagination recyclerver data, using this Stackoverflow ans link

我的代码供 recycerview 加载数据

private void getNewFireData() {
        final int limit = 3;
        final int mmcurrentItem;
        final int totalItem;
        final int ScrolledItem;
        mRecyclerView = rootView.findViewById(R.id.rv_post_list);
        final LinearLayoutManager mManeger=new LinearLayoutManager(getActivity());
        mRecyclerView.setLayoutManager(mManeger);
        final List<Posts> list = new ArrayList<>();
        final boolean[] isScrolling = {false};
        final boolean[] isLastItemReached = {false};
        final DocumentSnapshot lastVisible ;



        FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
        final CollectionReference postRef = rootRef.collection("posts");
        Query query = postRef.orderBy("datetime",
                Query.Direction.DESCENDING).limit(limit);
        query.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {

                if(task.isSuccessful()){

                    final DocumentSnapshot[] lastVisible = {task.getResult().getDocuments().get(task.getResult().size() - 1)};

                    for (DocumentSnapshot document : task.getResult()) {
                        Posts postModel = document.toObject(Posts.class);
                        list.add(postModel);

                    }
                    final Task<QuerySnapshot>[] mSnapy = new Task[]{task};
                    final NewPostAdapter mNewPostAdapter = new NewPostAdapter(list,getActivity()
                            , mSnapy[0]);

                    mRecyclerView.setAdapter(mNewPostAdapter);


                    mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
                        @Override
                        public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                            super.onScrollStateChanged(recyclerView, newState);
                            if(newState==AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL){

                                isScrolling[0] =true;
                            }
                        }

                        @Override
                        public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
                            super.onScrolled(recyclerView, dx, dy);

                            LinearLayoutManager linearLayoutManager = ((LinearLayoutManager) recyclerView.getLayoutManager());
                            int firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition();
                            int visibleItemCount = linearLayoutManager.getChildCount();
                            int totalItemCount = linearLayoutManager.getItemCount();




                            if (isScrolling[0] && (firstVisibleItemPosition + visibleItemCount == totalItemCount) && !isLastItemReached[0]) {
                                isScrolling[0] = false;
                                Query nextQuery = postRef.orderBy("datetime", Query.Direction.DESCENDING).startAfter(lastVisible[0]).limit(limit);
                                nextQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                    @Override
                                    public void onComplete(@NonNull Task<QuerySnapshot> t) {
                                        if (t.isSuccessful()) {
                                            for (DocumentSnapshot d : t.getResult()) {
                                                Posts productModel = d.toObject(Posts.class);
                                                list.add(productModel);
                                                mSnapy[0] =t;

                                            }

                                            mNewPostAdapter.notifyDataSetChanged();
                                            lastVisible[0] = t.getResult().getDocuments().get(t.getResult().size() - 1);

                                            if (t.getResult().size() < limit) {
                                                isLastItemReached[0] = true;
                                            }
                                        }
                                    }
                                });
                            }

                        }
                    });


                }

            }
        });



    }

并且视图持有人和适配器类为

and view holder and adapter class is

public class NewPostAdapter extends RecyclerView.Adapter<NewPostAdapter.NewPostHolder> {
    private List<Posts> list;
    Context context;
    Task<QuerySnapshot> task;
    public NewPostAdapter(List<Posts> list, Context context, Task<QuerySnapshot> task) {
        this.list = list;
        this.context=context;
        this.task=task;
    }
@NonNull
@Override
public NewPostHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.custum_home_post, parent, false);
    return new NewPostHolder(view);
}

@Override
public void onBindViewHolder(@NonNull final NewPostHolder mHolder, final int position) {


    mHolder.tvSendername.setText(list.get(position).getSendername());
    mHolder.tvPostText.setText(list.get(position).getPosttext());
    mHolder.tvServiceType.setText(list.get(position).getServicetype());
    String datetime = list.get(position).getDatetime();
    MyDateTime myDateTime = new MyDateTime();
    String converteddatetime = myDateTime.getSaveTime(datetime);
    mHolder.tvDatetime.setText(converteddatetime);


    SharedPreferences prefs = context.getSharedPreferences("DholkaAppPref", Context.MODE_PRIVATE);
    String mUserid = prefs.getString("userid", "Couldn't load userid");

     final String postid=task.getResult().getDocuments().get(position).getId();


  if (mUserid.equalsIgnoreCase("LNvc0acRiaPioaKVnXasjkjEeYE2")) {
        if (list.get(position).getVerified().equalsIgnoreCase("no")) {
            mHolder.llPostAproval.setVisibility(View.VISIBLE);
            mHolder.btPostApprove.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    if (list.get(position).getVerified().equalsIgnoreCase("no")) {
                        PostApproval approval = new PostApproval(context, postid);
                    }
                }
            });
            mHolder.btPostDelete.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    String imagename = list.get(position).getPhotourl();
                    if (imagename.equalsIgnoreCase("nourl")) {
                        DocumentReference mPostref = FirebaseFirestore.getInstance().collection("posts").
                                document(postid);
                        mPostref.delete();
                    } else {
                        StorageReference mStorageref = FirebaseStorage.getInstance().getReferenceFromUrl(imagename);
                        mStorageref.delete();
                        DocumentReference mPostref = FirebaseFirestore.getInstance().collection("posts").
                                document(postid);
                        mPostref.delete();
                    }
                }
            });
        } else {
            mHolder.llPostAproval.setVisibility(View.GONE);
            mHolder.cardHome.setVisibility(View.VISIBLE);
        }
    } else {
        mHolder.llPostAproval.setVisibility(View.GONE);
    }
    if (mUserid.equalsIgnoreCase("LNvc0acRiaPioaKVnXasjkjEeYE2")) {



        mHolder.cardHome.setVisibility(View.VISIBLE);
        mHolder.cardHome.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {

                final AlertDialog.Builder builder = new AlertDialog.Builder(context);
                AlertDialog dialog;
                builder.setMessage(R.string.dialog_delete_post)
                        .setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                // FIRE ZE MISSILES!
                                String imagename = list.get(position).getPhotourl();
                                if (imagename.equalsIgnoreCase("nourl")) {
                                    DocumentReference mPostref = FirebaseFirestore.getInstance().collection("posts").
                                            document(postid);
                                    mPostref.delete();
                                } else {
                                    StorageReference mStorageref = FirebaseStorage.getInstance().getReferenceFromUrl(imagename);
                                    mStorageref.delete();
                                    DocumentReference mPostref = FirebaseFirestore.getInstance().collection("posts").
                                            document(postid);
                                    mPostref.delete();
                                }
                            }
                        })
                        .setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int id) {
                                dialog.dismiss();
                            }
                        });
                dialog = builder.create();
                dialog.show();


                return false;
            }
        });
    } else {
        if (list.get(position).getVerified().equalsIgnoreCase("yes")) {
            mHolder.cardHome.setVisibility(View.VISIBLE);
        } else {
            mHolder.cardHome.setVisibility(View.GONE);
        }
    }
    String text = list.get(position).getPosttext();
    if (text.length() > 150) {
        text = text.substring(0, 150) + "...";
        mHolder.tvPostText.setText(Html.fromHtml(text + "<font color='green'> <u>Read More</u></font>"));
        mHolder.tvPostText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mHolder.tvPostText.setText(list.get(position).getPosttext());

            }
        });
    } else {
        mHolder.tvPostText.setText(list.get(position).getPosttext());
    }
    mHolder.tvTotalLike.setText("Likes : " + list.get(position).getTotal_like());
    mHolder.tvTotalComments.setText("Comments : " + list.get(position).getTotal_comment());

    final String photourl = list.get(position).getPhotourl();
    if (photourl.equalsIgnoreCase("nourl")) {
        mHolder.ivPostphoto.setVisibility(View.GONE);
    } else {
        mHolder.ivPostphoto.setVisibility(View.VISIBLE);
        FirebaseStorage fs = FirebaseStorage.getInstance();
        fs.getReferenceFromUrl(photourl);
        StorageReference mImageRef = fs.getReference();
        String ssss = fs.getReferenceFromUrl(photourl).getName();
        mImageRef.child("post_photos/" + ssss).getDownloadUrl()
                .addOnSuccessListener(new OnSuccessListener<Uri>() {
                    @Override
                    public void onSuccess(Uri uri) {
                        mHolder.postImageUri = uri;
                           /* Picasso.with(holder.ivPostphoto.getContext()).
                                    load(uri).
                                    placeholder(R.drawable.ic_image_black_24dp).
                                    into(holder.ivPostphoto);*/
                       /* float thumb=0;
                        Glide.with(context).asBitmap()
                                .load(uri)
                                .thumbnail(thumb)
                                .into(mHolder.ivPostphoto);*/
                        Picasso.with(context).load(uri).fit().centerCrop()
                                .placeholder(R.drawable.ic_image_black_24dp)
                                .error(R.drawable.ic_image_black_24dp)
                                .into(mHolder.ivPostphoto);
                        //ivPostphoto.setImageURI(uri);


                    }
                }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
            }
        });
    }

    final String senderId = list.get(position).getSenderid();
    StorageReference mProfileRef =
            FirebaseStorage.getInstance().getReference();
    mProfileRef.child("profile_pic/" + senderId + ".jpg").getDownloadUrl()
            .addOnSuccessListener(new OnSuccessListener<Uri>() {
                @Override
                public void onSuccess(Uri uri) {
                    //   Picasso.with(context).load(uri).into(holder.ivSenderphoto);

                    Picasso.with(context).load(uri).fit().centerCrop()
                            .placeholder(R.drawable.ic_account_circle_black_24dp)
                            .error(R.drawable.ic_account_circle_black_24dp)
                            .into(mHolder.ivSenderphoto);


                }
            }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Picasso.with(context).load(R.drawable.ic_account_circle_black_24dp).fit().centerCrop()
                    .placeholder(R.drawable.ic_account_circle_black_24dp)
                    .error(R.drawable.ic_account_circle_black_24dp)
                    .into(mHolder.ivSenderphoto);
        }
    });
}

@Override
public int getItemCount() {
    return list.size();
}


public class NewPostHolder extends RecyclerView.ViewHolder {

    TextView tvSendername,tvDatetime,tvServiceType,tvPostText,tvTotalLike,tvTotalComments;
    ImageView ivSenderphoto;
    PhotoView ivPostphoto;
    ImageButton ibLike,ibComments,ibShare, ibCall, ibMap;
    LinearLayout llPostAproval;
    Button btPostApprove,btPostDelete;
    CardView cardHome;
    Uri postImageUri;
    View rootView;
    RelativeLayout rlPosts;
    View view;
    NewPostHolder(View itemView) {
        super(itemView);
        view = itemView;
        tvSendername=(TextView)itemView.findViewById(R.id.tv_poster_username);
        tvDatetime=(TextView)itemView.findViewById(R.id.tv_poster_datetime);
        tvServiceType=(TextView)itemView.findViewById(R.id.tv_poster_servicetype);
        tvPostText=(TextView)itemView.findViewById(R.id.tv_poster_text);
        tvTotalLike=(TextView)itemView.findViewById(R.id.tv_poster_total_likes);
        tvTotalComments=(TextView)itemView.findViewById(R.id.tv_poster_total_comments);
        ivSenderphoto=(ImageView)itemView.findViewById(R.id.iv_poster_photo);
        ivPostphoto=(PhotoView) itemView.findViewById(R.id.iv_poster_images);
        ibLike=(ImageButton)itemView.findViewById(R.id.ib_poster_like);
        ibComments=(ImageButton)itemView.findViewById(R.id.ib_poster_comments);
        ibShare=(ImageButton)itemView.findViewById(R.id.ib_poster_share);
        ibCall=(ImageButton)itemView.findViewById(R.id.ib_poster_call);
        ibMap=(ImageButton)itemView.findViewById(R.id.ib_poster_map);
        llPostAproval=(LinearLayout)itemView.findViewById(R.id.linearPosterApproval);
        btPostApprove=(Button)itemView.findViewById(R.id.bt_poster_approve);
        btPostDelete=(Button)itemView.findViewById(R.id.bt_poster_delete);
        cardHome=(CardView)itemView.findViewById(R.id.card_home_post);
        rlPosts=(RelativeLayout)itemView.findViewById(R.id.rl_home_posts);
        tvPostText.setTextIsSelectable(true);
    }


}

}

现在,我的问题和我在获取前三个ID(三个ID是我的限制)之后获取 Document ID 时遇到了困难,下面显示了错误.因此,请帮助我获取下一个查询文档ID.希望你能理解.谢谢您的全力帮助错误:

Now, my questions and i am getting difficulty to get Document Id after first three id(three id is my limit), after getting first three documents error is displayed belows. so kindly please help me about this to get next query documents id. hope you understands. thank you for your all help Error :

2020-02-15 16:56:56.138 22675-22675/app.burhani.dholkaapp E/AndroidRuntime: FATAL EXCEPTION: main
Process: app.burhani.dholkaapp, PID: 22675
java.lang.IndexOutOfBoundsException: Index: 3, Size: 3
    at java.util.ArrayList.get(ArrayList.java:437)
    at app.burhani.dholkaapp.newadapter.NewPostAdapter.onBindViewHolder(NewPostAdapter.java:81)
    at app.burhani.dholkaapp.newadapter.NewPostAdapter.onBindViewHolder(NewPostAdapter.java:47)
    at androidx.recyclerview.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:7056)
    at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7098)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6010)
    at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6277)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6116)
    at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6112)
    at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
    at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
    at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
    at androidx.recyclerview.widget.LinearLayoutManager.scrollBy(LinearLayoutManager.java:1391)
    at androidx.recyclerview.widget.LinearLayoutManager.scrollVerticallyBy(LinearLayoutManager.java:1128)
    at androidx.recyclerview.widget.RecyclerView.scrollStep(RecyclerView.java:1841)
    at androidx.recyclerview.widget.RecyclerView$ViewFlinger.run(RecyclerView.java:5300)
    at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1163)
    at android.view.Choreographer.doCallbacks(Choreographer.java:986)
    at android.view.Choreographer.doFrame(Choreographer.java:894)
    at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1148)
    at android.os.Handler.handleCallback(Handler.java:883)
    at android.os.Handler.dispatchMessage(Handler.java:100)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:7682)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:516)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:950)

推荐答案

可能是因为您正在发送职位,并且给了您错误,请尝试发送最终字符串postid = task.getResult().getDocuments().get(position-1).getId(); ,看看您是否正在获取想要的对象.让我知道它对您有用

It could be because you are sending the position and you that gives you the error, try to send final String postid=task.getResult().getDocuments().get(position-1).getId(); and see if you are getting the object that you want.Let me know it that works for you

这篇关于如何取得文件编号?Firestore分页的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆