1、添加依赖
- implementation ‘androidx.recyclerview:recyclerview:1.2.0-alpha03’
2、构建Item布局
3、构建ItemBean
public class ItemBean_List {
private String id = "";
private String productModel = "";
ItemBean_List(String id, String productModel) {
this.id = id;
this.productModel = productModel;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getProductModel() {
return productModel;
}
public void setProductModel(String productModel) {
this.productModel = productModel;
}
}
4、构建Adapter
public class ListViewAdapter extends RecyclerView.Adapter<ListViewAdapter.InnerHolder> {
private List<ItemBean_List> mData;
private static OnItemClickListener mOnItemClickListener;
void setData(List<ItemBean_List> data) {
mData = data;
}
@NonNull
@Override
public InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false);
return new InnerHolder(view);
}
@Override
public void onBindViewHolder(@NonNull InnerHolder holder, int position) {
holder.setData(mData.get(position), position);
}
@Override
public int getItemCount() {
if (mData != null) {
return mData.size();
}
return 0;
}
static class InnerHolder extends RecyclerView.ViewHolder {
private static final String TAG = "InnerHolder";
TextView textView1, textView2;
int mPosition;
InnerHolder(@NonNull View itemView) {
super(itemView);
textView1 = itemView.findViewById(R.id.textView1);
textView2 = itemView.findViewById(R.id.textView2);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mOnItemClickListener.onClick(mPosition, v);
}
});
}
void setData(ItemBean_List itemBean, int position) {
textView1.setText(itemBean.getId());
textView2.setText(itemBean.getProductModel());
mPosition = position;
}
}
void setItemClickListener(OnItemClickListener listener) {
mOnItemClickListener = listener;
}
public interface OnItemClickListener {
void onClick(int position, View v);
}
}
使用
List<ItemBean_List> mData_List = new ArrayList<>();
LinearLayoutManager mLinearLayoutManager = new LinearLayoutManager(this);
mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
mRecyclerView.setLayoutManager(mLinearLayoutManager);
ListViewAdapter listViewAdapter = new ListViewAdapter();
for (int i = 1; i < 20; i++) {
mData_List.add(new ItemBean_List("A" + i, "xxxxx"));
}
listViewAdapter.setData(mData_List);
listViewAdapter.setItemClickListener(new ListViewAdapter.OnItemClickListener() {
@Override
public void onClick(int position, View v) {
Log.d(TAG, "onClick: " + position);
}
});
mRecyclerView.setAdapter(listViewAdapter);
数据刷新
- 更新mData_List,然后执行listViewAdapter.notifyDataSetChanged();即可
- 要注意的是这里的listViewAdapter要保持原对象,在以参数传出去后再使用notifyDataSetChanged是无效的。
无限循环(伪)
- 伪无限循环就是还是会滚到尽头的,但可能需要程序持续运行几十年的时间(我认了)
- 第一步,修改getItemCount(),使列表非常的长
@Override
public int getItemCount() {
if (mData != null) {
return Integer.MAX_VALUE;
}
return 0;
}
- 第二步,修改onBindViewHolder(),将数据循环绑定
@Override
public void onBindViewHolder(@NonNull LongListViewAdapter.InnerHolder holder, int position) {
if (mData != null && mData.size() != 0)
holder.setData(mData.get(position % mData.size()), position);
}
另一个循环的思路
- 滚动到底部之后再返回顶部再次滑动
- 那这样我们需要知道滑动到底部的事件,2个方法,第一个是通过每次滑动后检查最后一个position是不是列表最后一个
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (mLinearLayoutManager.findLastCompletelyVisibleItemPosition() == mListViewAdapter_view1_recyclerView.getItemCount()) {
}
}
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
}
});
- 第二种是自定义RecyclerView(外部调用参数也行,不过这样好看些)
public boolean isSlideToBottom() {
return computeVerticalScrollExtent() + computeVerticalScrollOffset() >= computeVerticalScrollRange();
}