安卓 RecyclerView添加分页功能

4

我为我的应用程序创建了一个RecyclerView,并试图找到一种停止大量请求的方法,我想要使用进度条每次获取10个结果。我的服务器将在每次滚动到最后一个项目时,按照10个为一组的方式发送结果。

    public class ProfileActivityFriendsList extends AppCompatActivity {
        String[] names={"Ander Herera","David De Gea","Michael Carrick","Juan Mata","Diego Costa","Oscar"};
        String[] positions={"Midfielder","GoalKeeper", "Midfielder","Playmaker","Striker","Playmaker"};
        String[] urls={"Midfielder","GoalKeeper", "Midfielder","Playmaker","Striker","Playmaker"};
        int[] images = {R.mipmap.ic_launcher,R.mipmap.ic_launcher, R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher,R.mipmap.ic_launcher};

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_profile_friends_list);

            Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
            setSupportActionBar(toolbar);

            //GET RECYCLER
            RecyclerView rv = (RecyclerView) findViewById(R.id.myRecycler);
            //SET LAYOUT
            rv.setLayoutManager(new LinearLayoutManager(this));
            rv.setItemAnimator(new DefaultItemAnimator());
            //ADAPTER
            MyAdapter adapter = new MyAdapter(this, names, positions, urls, images);
            rv.setAdapter(adapter);
        }
} 

这是我的适配器类。

public class MyAdapter extends RecyclerView.Adapter<MyHolder> {
    Context c;
    String[] names;
    String[] positions;
    String[] urls;
    int[] img;

    public MyAdapter(Context ctx, String[] names, String[] positions,String[] urls, int[] images){
        this.c=ctx;
        this.names = names;
        this.positions = positions;
        this.img = images;
        this.urls = urls;
    }
    @Override
    public MyHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.friend_list_model,null);

        MyHolder holder = new MyHolder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(MyHolder holder, final int position) {
        holder.imageView.setImageResource(img[position]);
        holder.name.setText(names[position]);
        holder.desc.setText(positions[position]);

        holder.serItemClickListener(new ItemClickListener() {
            @Override
            public void onItemClick(View v, int pos) {
                Snackbar.make(v,positions[position]+" "+positions[position],Snackbar.LENGTH_LONG).show();
            }
        });
    }

    @Override
    public int getItemCount() {
        return names.length;
    }
}

这是占位符。

public class MyHolder extends RecyclerView.ViewHolder implements View.OnClickListener{
    CircleImageView imageView;
    TextView name;
    TextView desc;
    ItemClickListener itemClickListener;
    public MyHolder(View itemView) {
        super(itemView);

        imageView = (CircleImageView) itemView.findViewById(R.id.circleImageView1);
        name = (TextView) itemView.findViewById(R.id.textName);
        desc = (TextView) itemView.findViewById(R.id.textDesc);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        this.itemClickListener.onItemClick(v,getLayoutPosition());
    }
    public void serItemClickListener(ItemClickListener ic){
        this.itemClickListener = ic;
    }
}

我看了很多教程,但是找不到清晰的解决方案。我认为有一些方法可以实现它,但我不知道我的代码是否可用于添加它。

4个回答

5

https://github.com/kunal-mahajan/PaginationAdeptor

我已经实现了分页组件/小部件,它非常容易实现。不需要xml,只需扩展类即可。示例可在上述url中使用计时器任务和虚拟数据。在主活动中,您可以更改用于测试目的的可用数据数量,例如"final int totalRecords"。如果有任何问题,我会回答您的疑问。 谢谢 Kunal

非常好的示例,它对我有用,谢谢kunal!我发现这是一个有趣的解决复杂问题的方法。如果请求计数没有填满屏幕,它也会自动加载新的请求。 - krishan mohan verma
厉害的代码,先生。您已经简化了任何列表加载屏幕,无论是水平还是垂直的自动分页,唯一的要求是为任何屏幕创建适配器类。非常喜欢这个代码,谢谢! - Sourab Sharma
非常感谢您,先生。您节省了一天以上的工作时间。 - sam2395

5
我们所做的是使用 RecyclerView.OnScrollListener。假设您正在使用LinearLayoutManager,您可以检查当前显示的项目与总数以确定何时到达最后一个项目,然后请求下一页。您还需要添加一些额外的逻辑检查,以提前防止“垃圾邮件”,因为滚动事件经常发生。
例如:
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        if (!hasMoreContent()) {
            return;
        }

        if (currentlyLoadingInitialRequest()) {
            return;
        }

        if (alreadyLoadingNextPage()) {
            return;
        }

        if (isInErrorState()) {
            return;
        }

        LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
        int total = layoutManager.getItemCount();
        int currentLastItem = layoutManger.findLastVisibleItemPosition();
        if (currentLastItem == total - 1) {
            requestNextPage();
        }
    });

这是一个有用的技巧,谢谢。 - Parth Patel

2
您可以尝试这种方法:
  mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener()
{
    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        if (dy > 0) //check for scroll down
        {
            visibleItemCount = mLayoutManager.getChildCount();
            totalItemCount = mLayoutManager.getItemCount();
            pastVisibleItems = mLayoutManager.findFirstVisibleItemPosition();

            if (loading) {
                if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
                    loading = false;
                    if (adapter.countOfShowing < adapter.allChallenges.size()) {
                        Log.e("...", "Last Item Wow !");
                        adapter.increaseCountOfShowing();
                        adapter.notifyDataSetChanged();
                    }
                    loading = true;
                    //Do pagination.. i.e. fetch new data
                }
            }
        }
    }
});

你能给一些adapter.countOfShowing、adapter.allChallenges.size()和adapter.increaseCountOfShowing()的例子吗?我需要如何实现它们? - Ahmet Aziz Beşli
哦,对不起。我只是在这里复制了自己的代码。我在我的适配器中保留了2个数组allItems和showedItems(我们称之为这样)。increaseCountOfShowing()只是增加了showedItemsSize并用AllItems元素填充它们。你明白了吗? - user8384007
1
不用了,我会尝试找到理解onScrolled和适配器问题的方法。谢谢你的帮助! - Ahmet Aziz Beşli
1
我完成了除了countOfShowing的部分。你是怎么把countOfShowing转成整数的?它的方法是什么? - Ahmet Aziz Beşli
只需一个简单的方法,即可增加变量countOfShowing的数量,例如通过10。然后,我将重新初始化showedItems数组,并使用新的大小填充其中所有元素。 - user8384007

-1

在同一个活动中使用两个带分页的RecyclerView,然后出现获取滚动位置的问题。

第一个RecyclerView添加到可折叠工具栏中,第二个RecyclerView添加到滚动视图中,第二个RecyclerView带有分页功能且正常工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接