[英]Android RecyclerView adding pagination
我为我的应用程序创建了一个 RecyclerView 并试图找到一种方法来停止大量请求,我想通过进度条获得 10 x 10 的结果。 我的服务器将在每次向下滚动到最后一项时发送 10 x 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);
}
}
这是我的适配器 class。
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;
}
}
我看了很多教程,但找不到明确的解决方案,我认为有一些方法可以做到,但我不知道我的代码是否可以添加它?
https://github.com/kunal-mahajan/PaginationAdeptor
我已经实现了分页组件/小部件,并且实现起来非常简单。 不需要xml只需要扩展类。 上面的url中提供了带有计时器任务和虚拟数据的示例。 在主要活动中,您可以在“final int totalRecords”中更改可用于测试目的的数据的数量; 如果有任何问题将回答您的疑问。 谢谢库纳尔
你可以尝试这种方法:
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
}
}
}
}
});
我们做的是使用ReyclerView.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();
}
});
第一个 RecyclerView 添加折叠工具栏,第二个 RecyclerView 添加滚动,然后第二个 RecyclerView 可以很好地处理分页。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.