此错误的分页java.lang.IllegalArgumentException:限制必须为正整数

问题描述 投票:-1回答:1

我的代码有问题,请帮助我更正我的代码,如果它不起作用,我是Android编程的新手

PostAdapter

package com.developer.fireone.fingaoffice.Adapter;


import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.media.MediaPlayer;
import android.net.Uri;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.PopupMenu;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.content.FileProvider;
import androidx.fragment.app.FragmentActivity;
import androidx.recyclerview.widget.RecyclerView;

import com.android.volley.AuthFailureError;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonObjectRequest;
import com.android.volley.toolbox.Volley;
import com.bumptech.glide.Glide;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.Target;
import com.developer.fireone.fingaoffice.CommentsActivity;
import com.developer.fireone.fingaoffice.FollowersActivity;
import com.developer.fireone.fingaoffice.Fragment.PostDetailFragment;
import com.developer.fireone.fingaoffice.Fragment.ProfileFragment;
import com.developer.fireone.fingaoffice.Model.ForAllUser;
import com.developer.fireone.fingaoffice.Model.Post;
import com.developer.fireone.fingaoffice.Model.User;
import com.developer.fireone.fingaoffice.Notifications.Data;
import com.developer.fireone.fingaoffice.Notifications.Sender;
import com.developer.fireone.fingaoffice.Notifications.Token;
import com.developer.fireone.fingaoffice.R;
import com.developer.fireone.fingaoffice.VideoActivity;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.Query;
import com.google.firebase.database.ValueEventListener;
import com.google.gson.Gson;
import com.tylersuehr.socialtextview.SocialTextView;

import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import static java.security.AccessController.getContext;


public class PostAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private final int VIEW_TYPE_ITEM = 0;
    private final int VIEW_TYPE_LOADING = 1;

    public Context mContext;
    public List<Post> mPost;
    public Activity activity;
    public FirebaseUser firebaseUser;
    public RequestQueue requestQueue;
    public boolean notify = false;


    public PostAdapter(Context mContext, List<Post> mPost, Activity activity) {

        this.mContext = mContext;
        this.mPost = mPost;
        this.activity = activity;

    }

    @NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        if (viewType == VIEW_TYPE_ITEM) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.post_item, parent, false);
            return new ItemViewHolder(view);
        } else {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_loading, parent, false);
            return new LoadingViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {

        if (viewHolder instanceof ItemViewHolder) {

            populateItemRows((ItemViewHolder) viewHolder, position);
        } else if (viewHolder instanceof LoadingViewHolder) {
            showLoadingView((LoadingViewHolder) viewHolder, position);
        }

    }

    @Override
    public int getItemCount() {
        return mPost == null ? 0 : mPost.size();
    }

    /**
     * The following method decides the type of ViewHolder to display in the RecyclerView
     *
     * @param position
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        return mPost.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
    }

    private class ItemViewHolder extends RecyclerView.ViewHolder {

        public ImageView btn_play,image_profile, post_image, like, comment, save, more,certification_finga,share;
        public TextView username, fullname, likes, publisher, comments, txt_time, txt_date, finga_android;
        public SocialTextView description;
        public ImageView post_video;
        public ProgressBar progressBar;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);


            certification_finga=itemView.findViewById(R.id.certifier_finga);
            finga_android=itemView.findViewById(R.id.finga_android);
            progressBar=itemView.findViewById(R.id.progress);
            image_profile=itemView.findViewById(R.id.image_profile);
            share=itemView.findViewById(R.id.share);
            btn_play=itemView.findViewById(R.id.btn_play);
            post_image=itemView.findViewById(R.id.post_image);
            post_video=itemView.findViewById(R.id.post_video);
            like=itemView.findViewById(R.id.like);
            comment=itemView.findViewById(R.id.comment);
            save=itemView.findViewById(R.id.save);
            username=itemView.findViewById(R.id.username);
            fullname=itemView.findViewById(R.id.fullname);
            likes=itemView.findViewById(R.id.likes);
            publisher=itemView.findViewById(R.id.publisher);
            description=itemView.findViewById(R.id.description);
            comments=itemView.findViewById(R.id.comments);
            more=itemView.findViewById(R.id.more);
            txt_date=itemView.findViewById(R.id.txt_date);
            txt_time=itemView.findViewById(R.id.txt_time);


        }
    }

    private class LoadingViewHolder extends RecyclerView.ViewHolder {

        ProgressBar progressBar;

        public LoadingViewHolder(@NonNull View itemView) {
            super(itemView);
            progressBar = itemView.findViewById(R.id.progressBar_loading);
        }
    }

    private void showLoadingView(LoadingViewHolder viewHolder, int position) {
        //ProgressBar would be displayed

    }

    private void populateItemRows(ItemViewHolder viewHolder, int position) {

       //...

    }

    //send Notification like...
    private void sendNotificaion(String receiver, final String username, final String msg) {

        DatabaseReference tokens = FirebaseDatabase.getInstance().getReference("Tokens");
        requestQueue= Volley.newRequestQueue(mContext);
        Query query = tokens.orderByKey().equalTo(receiver);
        query.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                    Token token = snapshot.getValue(Token.class);
                    Data dataComment = new Data(
                            firebaseUser.getUid(),
                            R.mipmap.logo4,
                            username+": "+msg,
                            "Le Yamo de xa ! ",
                            ""+receiver,
                            "LikeNotification");

                    Sender senderComment = new Sender(dataComment, token.getToken());
                    try {
                        JSONObject senderJsonObj = new JSONObject(new Gson().toJson(senderComment));
                        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("https://fcm.googleapis.com/fcm/send", senderJsonObj,
                                new Response.Listener<JSONObject>() {
                                    @Override
                                    public void onResponse(JSONObject response) {
                                        Log.d("JSON_RESPONSE", "onResponse: "+response.toString());

                                    }
                                }, new Response.ErrorListener() {
                            @Override
                            public void onErrorResponse(VolleyError error) {
                                Log.d("JSON_RESPONSE", "onResponse: "+error.toString());
                            }
                        }){
                            @Override
                            public Map<String, String> getHeaders() throws AuthFailureError {
                                Map<String,String> headers=new HashMap<>();
                                headers.put("Content-Type","application/json");
                                headers.put("Authorization","key=AAAAST1mR1g:APA91bFEgcbD3UGgdhByr7gEP2Zrc1o6Lg2yqAZfhsPKtY1jPaGmc5MKblGLn6kT0atmVlPo95xaGTpxxTn997Bm_X9mlJQ6gwlY7wGl-Z7HV9RuJA6CP2JgSd52jRLycDoL8l_ONklX");
                                return headers;
                            }
                        };

                        requestQueue.add(jsonObjectRequest);


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    private void shareTextOnly(String description) {

        String shareBody = description+"\n"+"\n"+ "Ce post ete partager depuis 'Finga' le reseau Social Afro telechargeable ici: " +
                "https://play.google.com/store/apps/details?id=com.developer.fireone.finga";

        Intent sIntent = new Intent(Intent.ACTION_SEND);
        sIntent.setType("text/plain");
        sIntent.putExtra(Intent.EXTRA_SUBJECT,"Finga>> Subject Here");
        sIntent.putExtra(Intent.EXTRA_TEXT,shareBody);
        mContext.startActivity(Intent.createChooser(sIntent,"Finga>> Share Via"));

    }

    private void ShareImageAndText(String description, Bitmap bitmap) {

        String shareBody = description +"\n"+ "\n"+"Ce post ete partager depuis 'Finga' le reseau Social Afro telechargeable ici: " +
                "https://play.google.com/store/apps/details?id=com.developer.fireone.finga";
        Uri uri = saveImageToShare(bitmap);

        Intent sIntent = new Intent(Intent.ACTION_SEND);
        sIntent.putExtra(Intent.EXTRA_STREAM,uri);
        sIntent.putExtra(Intent.EXTRA_TEXT,shareBody);
        sIntent.putExtra(Intent.EXTRA_SUBJECT,"Finga>> Subject Here");
        sIntent.setType("image/png");
        mContext.startActivity(Intent.createChooser(sIntent,"Finga>> Share Via"));


    }

    private Uri saveImageToShare(Bitmap bitmap) {

        File imageFolder = new File(mContext.getCacheDir(),"images");
        Uri uri = null;

        try {
            imageFolder.mkdirs();
            File file = new File(imageFolder,"shared_image.png");

            FileOutputStream stream =new FileOutputStream(file);
            bitmap.compress(Bitmap.CompressFormat.PNG, 90,stream);
            stream.flush();
            stream.close();
            uri= FileProvider.getUriForFile(mContext,"com.developer.fireone.finga.fileprovider",file);

        }catch (Exception e){
            Toast.makeText(mContext, ""+e.getMessage(), Toast.LENGTH_SHORT).show();
        }

        return uri;
    }

    private void getComments(String postid, final TextView comments ){

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Comments").child(postid);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                comments.setText(mContext.getString(R.string.viewAll)+" "+dataSnapshot.getChildrenCount()+" "+mContext.getString(R.string.comments1));

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    // isliked
    private void isLiked(String postid, final ImageView imageView){

        final FirebaseUser firebaseUser= FirebaseAuth.getInstance().getCurrentUser();

        DatabaseReference reference=FirebaseDatabase.getInstance().getReference()
                .child("Likes")
                .child(postid);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                try{
                    if(dataSnapshot.child(firebaseUser.getUid()).exists()){
                        imageView.setImageResource(R.drawable.ic_liked);
                        imageView.setTag("liked");
                    }else {
                        imageView.setImageResource(R.drawable.ic_like);
                        imageView.setTag("like");
                    }
                }catch (Exception e){
                    Toast.makeText(mContext, "wait a moment please...", Toast.LENGTH_SHORT).show();
                }


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });


    }


    private void addNotifications(String userid, String postid){
        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Notifications").child(userid);

        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("userid", firebaseUser.getUid());
        hashMap.put("text", mContext.getString(R.string.strlikePost));
        hashMap.put("postid", postid);
        hashMap.put("ispost", true);
        hashMap.put("isseen", false);
        reference.push().setValue(hashMap);
    }

    private  void nrLikes(final TextView likes, String postid){
        DatabaseReference reference=FirebaseDatabase.getInstance().getReference().child("Likes")
                .child(postid);
        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                likes.setText(dataSnapshot.getChildrenCount()+" yamo.");

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }


    private void  publisherInfo(final ImageView image_profile,final ImageView certification_finga, final TextView username, final TextView fullname, final TextView publisher, final String userid){

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Users").child(userid);

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                final User user= dataSnapshot.getValue(User.class);
                if(user.getCertifier()!=null && user.getCertifier().equals("certified")){

                    certification_finga.setVisibility(View.VISIBLE);

                }else{
                    certification_finga.setVisibility(View.GONE);
                }
                Glide.with(mContext.getApplicationContext()).load(user.getImageurl()).into(image_profile);
                username.setText(user.getUsername());
                fullname.setText(user.getFullname());
                publisher.setText(user.getUsername());

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    private void isSave(final String postid, final ImageView imageView){
        FirebaseUser firebaseUser = FirebaseAuth.getInstance().getCurrentUser();

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference().child("Saves")
                .child(firebaseUser.getUid());

        reference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                if(dataSnapshot.child(postid).exists()){
                    imageView.setImageResource(R.drawable.ic_saved);
                    imageView.setTag("saved");
                }else{
                    imageView.setImageResource(R.drawable.ic_save_black);
                    imageView.setTag("save");
                }

            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

    }

    private void editPost(final String postid){

        final AlertDialog.Builder alertDialog = new AlertDialog.Builder(mContext);
        alertDialog.setTitle(R.string.strEditPost);

        final EditText editText = new EditText(mContext);
        LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(
                LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT
        );
        editText.setLayoutParams(lp);
        alertDialog.setView(editText);

        getText(postid, editText);
        alertDialog.setPositiveButton(R.string.strEdit, (dialogInterface, i) -> {

            HashMap<String, Object> hashMap = new HashMap<>();
            hashMap.put("description", editText.getText().toString());

            FirebaseDatabase.getInstance().getReference("Posts")
                    .child(postid).updateChildren(hashMap);

        });
        alertDialog.setNegativeButton(R.string.strCancel, (dialogInterface, i) -> dialogInterface.dismiss());

        alertDialog.show();

    }

    private void getText(String postid, final EditText editText) {

        DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts")
                .child(postid);

        reference.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                editText.setText(dataSnapshot.getValue(Post.class).getDescription());


            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

MainFragment

 private void initScrollListener() {
        recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
            }

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

                LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

                if (!isLoading) {
                    if (linearLayoutManager != null && linearLayoutManager.findLastCompletelyVisibleItemPosition() == postList.size() - 1) {
                        //bottom of list!
                        loadMore();
                        isLoading = true;
                    }
                }
            }
        });


    }

    private void loadMore() {

        postList.add(null);
        postAdapter.notifyItemInserted(postList.size() - 1);


        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                postList.remove(postList.size() - 1);
                int scrollPosition = postList.size();
                postAdapter.notifyItemRemoved(scrollPosition);
                currentSize = scrollPosition;
                DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
                reference.keepSynced(true);

                Query postQuery = reference.startAt(oldestPostId).limitToLast(currentSize*10);

                postQuery.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {

                        postList.clear();

                        for(DataSnapshot snapshot:dataSnapshot.getChildren()){

                            Post post = snapshot.getValue(Post.class);
                            for(String id:followingList){
                                oldestPostId = dataSnapshot.getKey();
                                snapshot.getChildrenCount();

                                if(post.getPublisher()!=null && post.getPublisher().equals(id)){

                                    postList.add(post);
                                    indication.stopShimmer();
                                    indication.setVisibility(View.GONE);
                                    currentSize++;


                                }

                            }

                            if(post.getPublisher()!=null && post.getPublisher().equals(firebaseUser.getUid())){
                                postList.add(post);
                                //stop shimmer
                                indication.setVisibility(View.GONE);
                                indication.stopShimmer();

                            }

                        }

//                postAdapter.notifyItemRemoved(postList.size());
//                postAdapter.notifyItemChanged(postList.size());
                        postAdapter.notifyDataSetChanged();
                        isLoading=false;

                    }

                    @Override
                    public void onCancelled(DatabaseError databaseError) {

                    }
                });


                postAdapter.notifyDataSetChanged();
                isLoading = false;
            }
        }, 2000);


    }


    }







    private void readsposts(){

            DatabaseReference reference = FirebaseDatabase.getInstance().getReference("Posts");
            reference.keepSynced(true);

             Query postQuery = reference.limitToLast(10);

            postQuery.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                         postList.clear();

                    for(DataSnapshot snapshot:dataSnapshot.getChildren()){

                        Post post = snapshot.getValue(Post.class);
                        for(String id:followingList){

                            if(post.getPublisher()!=null && post.getPublisher().equals(id)){



                                postList.add(post);
                                indication.stopShimmer();
                                indication.setVisibility(View.GONE);


                            }

                        }

                        if(post.getPublisher()!=null && post.getPublisher().equals(firebaseUser.getUid())){
                            postList.add(post);
                            //stop shimmer
                            indication.setVisibility(View.GONE);
                            indication.stopShimmer();

                             }

                        }

//                postAdapter.notifyItemRemoved(postList.size());
//                postAdapter.notifyItemChanged(postList.size());
                postAdapter.notifyDataSetChanged();

                }

                @Override
                public void onCancelled(DatabaseError databaseError) {

                }
            });

    }
android firebase-realtime-database android-recyclerview recycler-adapter
1个回答
1
投票
如异常所示,

C0]函数中行limitToLast(...)中的[Query postQuery = reference.startAt(oldestPostId).limitToLast(currentSize*10);函数必须为positive整数”。因此,如果您的loadMore()为0,则会引发此异常。

因此而不是currentSize,您应该将其替换为:currentSize = scrollPosition;

© www.soinside.com 2019 - 2024. All rights reserved.