【问题标题】:recyclerview sometimes get data on scroll, sometimes notrecyclerview 有时会在滚动时获取数据,有时不会
【发布时间】:2017-03-05 10:03:39
【问题描述】:

我有一个 recyclerview 可以获取前 10 个项目,当我向下滚动时,有时它会获取其他项目,有时不会:

item 22
item 21
item 20
item 19
item 18
item 17
item 16
item 15
item 14
item 13
usually it stops at item 13. (not getting the onscroll items)

但有时它会起作用并得到其他人 (12,11,10,9,8,7,6,5,4,3,2,1...)

我的滚动代码:

  recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (isLastItemDisplaying(recyclerView)) {
                    getData();
                }
            }
        });

获取数据:

 private void getData() {
        requestQueue.add(getDataFromServer(requestCount, user_id));
    }

获取数据服务器

private JsonArrayRequest getDataFromServer(String requestCount, String user_id) {
    //Initializing ProgressBar
    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1);

    //Displaying Progressbar
    progressBar.setVisibility(View.VISIBLE);

    requestCount = requestCount + "&user=" + user_id;

    //JsonArrayRequest of volley
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL + String.valueOf(requestCount),
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    //Calling method parseData to parse the json response
                    parseData(response);
                    //Hiding the progressbar
                    progressBar.setVisibility(View.GONE);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressBar.setVisibility(View.GONE);
                    //If an error occurs that means end of the list has reached
                    Toast.makeText(UserAreaActivity.this, "No More Items Available", Toast.LENGTH_SHORT).show();
                }
            });

    //Returning the request
    return jsonArrayRequest;
}

检查最后一项

 //This method would check that the recyclerview scroll has reached the bottom or not
    private boolean isLastItemDisplaying(RecyclerView recyclerView) {
        if (recyclerView.getAdapter().getItemCount() != 0) {
            int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
            if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
                return true;
        }
        return false;
    }

任何想法为什么它有时有效,为什么不有效?

----------------> 编辑

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

    //Imageloader to load image
    private ImageLoader imageLoader;
    private final Context context;

    //List to store all posts
    List<Posts> Posts;


    //Constructor of this class
    public CardAdapter(List<Posts> Post, Context context){
        super();
        //Getting all
        this.Posts = Post;
        this.context = context;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.posts_list, parent, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        Posts post =  Posts.get(position);
        holder.post = post;

        //Loading image from url
        //imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();

        //Showing data on the views
        //holder.imageView.setImageUrl(post.getImageUrl(), imageLoader);


        Picasso.with(context).load(post.getImageUrl()).into(holder.imageView);


        holder.textViewName.setText(post.getName());
        holder.textViewPublisher.setText(post.getPublisher());

        holder.setIsRecyclable(false);

    }

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

    class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
        //Views
        public ImageView imageView;
        public TextView textViewName;
        public TextView textViewPublisher;
        public Posts post;

        public ImageView ProfilePic;

        //Initializing Views
        public ViewHolder(View itemView) {
            super(itemView);
            imageView = (ImageView) itemView.findViewById(R.id.imageViewHero);
            textViewName = (TextView) itemView.findViewById(R.id.textViewName);
            textViewPublisher = (TextView) itemView.findViewById(R.id.textViewPublisher);

        }
        @Override
        public void onClick(View v) {

                //...

            }

        }

    }
}

------------------------------------------ 编辑 2

private JsonArrayRequest getDataFromServer(String requestCount, String user_id) {
    //Initializing ProgressBar
    final ProgressBar progressBar = (ProgressBar) findViewById(R.id.progressBar1);

    //Displaying Progressbar
    progressBar.setVisibility(View.VISIBLE);

    requestCount = requestCount + "&user=" + user_id;

    //JsonArrayRequest of volley
    JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(Config.DATA_URL + String.valueOf(requestCount),
            new Response.Listener<JSONArray>() {
                @Override
                public void onResponse(JSONArray response) {
                    //Calling method parseData to parse the json response
                    parseData(response);
                    //Hiding the progressbar
                    progressBar.setVisibility(View.GONE);
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    progressBar.setVisibility(View.GONE);
                    //If an error occurs that means end of the list has reached
                    Toast.makeText(UserAreaActivity.this, "No More Items Available", Toast.LENGTH_SHORT).show();
                }
            });

    //Returning the request
    return jsonArrayRequest;
}

//This method will get data from the web api
private void getData() {
    //Adding the method to the queue by calling the method getDataFromServer
    requestQueue.add(getDataFromServer(requestCount, user_id));
    //Incrementing the request counter
    //requestCount++;
}

//This method will parse json data
private void parseData(JSONArray array) {
    for (int i = 0; i < array.length(); i++) {
        //Creating the object
        Posts PostObj = new Posts();
        JSONObject json = null;
        try {
            //Getting json
            json = array.getJSONObject(i);

            //Adding data to the object
            PostObj.setImageUrl(json.getString(Config.TAG_IMAGE_URL));
            PostObj.setName(json.getString(Config.TAG_NAME));
            PostObj.setPublisher(json.getString(Config.TAG_PUBLISHER));

            requestCount = PostObj.setId(json.getString(Config.TAG_ID));

        } catch (JSONException e) {
            e.printStackTrace();
        }
        //Adding object to the list
        listPosts.add(PostObj);
    }

    //Notifying the adapter that data has been added or changed
    adapter.notifyDataSetChanged();
}

【问题讨论】:

  • recyclerview是在activity还是fragment中?
  • @Cochi 这是一个活动
  • 谢谢,你能显示更新回收器视图适配器的代码吗?
  • @Cochi 当然!我将使用我的适配器添加编辑
  • 在哪里给你新闻获取项到适配器?

标签: android android-studio android-recyclerview


【解决方案1】:

你试过吗? :

    private boolean isLastItemDisplaying(RecyclerView recyclerView) {
            if (recyclerView.getAdapter().getItemCount() != 0) {
            // instead of findLastCompletelyVisibleItemPosition
                int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition(); 
                if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
                    return true;
            }
            return false;
        }

【讨论】:

  • 哦,它正在工作。我的分页错误,但我认为这是我需要调整才能获得最后一个帖子 ID。
  • 太棒了 :) 如果这个答案已经解决了您的问题,请考虑通过单击复选标记来接受它。这向社区表明您已找到解决方案。没有义务这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多