一、框架引入
- 先在项目的 build.gradle(Project:XXXX) 的 repositories 添加:
allprojects {
repositories { ...
maven { url "https://jitpack.io" }
}
}
- 然后在Module的 build.gradle(Module:app) 的 dependencies 添加:
dependencies {
......
compile 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.22'
}
2.2 最基本使用示例
编写适配器
MyAdapter.java
public class MyAdapter extends BaseQuickAdapter<Model, BaseViewHolder> {
public MyAdapter(@LayoutRes int layoutResId, @Nullable List<Model> data) {
super(layoutResId, data);
}
@Override
protected void convert(BaseViewHolder helper, Model item) {
//获取当前条目position
//int position = helper.getLayoutPosition();
//可链式调用赋值
helper.setText(R.id.tv_title, item.getTitle())//标题
.setText(R.id.tv_content, item.getContent())//内容
.setImageResource(R.id.iv_img, R.mipmap.ic_launcher);//背景
}
}
最后一步:在Activity中使用该适配器
MainActivity.java
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
private List<Model> datas;
private MyAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化RecyclerView
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
//模拟的数据(实际开发中一般是从网络获取的)
datas = new ArrayList<>();
Model model;
for (int i = 0; i < 15; i++) {
model = new Model();
model.setTitle("我是第" + i + "条标题");
model.setContent("第" + i + "条内容");
datas.add(model);
}
//创建布局管理
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(layoutManager);
//创建适配器 (在这特别说明一下,括号离填item布局和集合数据,分别把布局和数据添加进去)
adapter = new MyAdapter(R.layout.item_rv, datas);
//给RecyclerView设置适配器
recyclerView.setAdapter(adapter);
}
}
还有最重要的,我也老是忘记怎么写的,单击子item的点击事件和整条item的的点击事件
往下接着看👉
条目事件
Item的点击事件
//条目点击事件
adapter.setOnItemClickListener(new BaseQuickAdapter.OnItemClickListener() {
@Override
public void onItemClick(BaseQuickAdapter adapter, View view, int position) {
Toast.makeText(MainActivity.this, "点击了第" + (position + 1) + "条条目", Toast.LENGTH_SHORT).show();
}
});
Item的长按事件
//条目长按事件
adapter.setOnItemLongClickListener(new BaseQuickAdapter.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(BaseQuickAdapter adapter, View view, int position) {
Toast.makeText(MainActivity.this, "长按了第" + (position + 1) + "条条目", Toast.LENGTH_SHORT).show();
return false;
}
});
注意事项
在嵌套recycleView的情况下需要使用你使用 adapter. setOnItemClickListener 来设置点击事件,如果使用recycleView.addOnItemTouchListener会累计添加的。
条目子控件事件
Item子控件的点击事件
- 首先:在adapter的convert方法里面通过 helper.addOnClickListener 绑定一下子控件的控件id
@Override
protected void convert(BaseViewHolder helper, Model item) {
//可链式调用赋值
helper.setText(R.id.tv_title, item.getTitle())
.setText(R.id.tv_content, item.getContent())
.addOnClickListener(R.id.iv_img) //给图标添加点击事件 (这一行很重要噢)
.setImageResource(R.id.iv_img, R.mipmap.ic_launcher);
//获取当前条目position
//int position = helper.getLayoutPosition();
}
- 然后:我们设置
//条目子控件点击事件
adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
Toast.makeText(MainActivity.this, "点击了第" + (position + 1) + "条条目的图片", Toast.LENGTH_SHORT).show();
}
});
Item子控件的长按事件
这里和子控件点击事件是一样的,只是将 点击 变成 长按 就可以了
首先:在adapter的convert方法里面通过 helper.addOnLongClickListener 绑定一下子控件的控件id
@Override
protected void convert(BaseViewHolder helper, Model item) {
//可链式调用赋值
helper.setText(R.id.tv_title, item.getTitle())
.setText(R.id.tv_content, item.getContent())
//.addOnClickListener(R.id.iv_img)
//给图标添加点击事件
.addOnLongClickListener(R.id.iv_img)//给图片添加长按事件
.setImageResource(R.id.iv_img, R.mipmap.ic_launcher);
//获取当前条目position
//int position = helper.getLayoutPosition(); }
- 然后:我们设置
//条目子控件长按事件 adapter.setOnItemChildLongClickListener(new BaseQuickAdapter.OnItemChildLongClickListener() {
@Override
public boolean onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
Toast.makeText(MainActivity.this, "长按了第" + (position + 1) + "条条目的图片", Toast.LENGTH_SHORT).show(); return false;
}
});
注意事项
- 设置子控件的事件,如果不在adapter中绑定,点击事件无法生效,因为无法找到你需要设置的控件。
多个Item子控件事件
官方文档上没说,但是 其实这里可以用很常规的方法处理,就是通过判断ID来判定是否是我要的控件?,从而处理不同的事件
比如我这里给 图片和标题 都加点击事件处理不同的逻辑
首先:当然是在适配器中给图片和标题都添加点击事件
@Override
protected void convert(BaseViewHolder helper, Model item) {
//可链式调用赋值
helper.setText(R.id.tv_title, item.getTitle())
.setText(R.id.tv_content, item.getContent())
.addOnClickListener(R.id.iv_img) //给图标添加 点击事件
.addOnClickListener(R.id.tv_title) //给标题也添加 点击事件
.setImageResource(R.id.iv_img, R.mipmap.ic_launcher);
//获取当前条目position
//int position = helper.getLayoutPosition(); }
- 其次:
//条目子控件点击事件
adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
//判断id
if (view.getId() == R.id.iv_img) {
Log.i("tag", "点击了第" + position + "条条目的 图片");
} else if (view.getId() == R.id.tv_title) {
Log.i("tag", "点击了第" + position + "条条目的 标题");
}
}
});
- 那么如果是长按事件呢?当然也是相同的处理方法。
如果需要在子控件事件中获取其他子控件可以使用:
getViewByPosition(RecyclerView recyclerView, int position, @IdRes int viewId)
比如:
//条目子控件点击事件
adapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
@Override
public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
Toast.makeText(MainActivity.this, "点击了第" + (position + 1) + "条条目的图片", Toast.LENGTH_SHORT).show();
TextView tv_title = (TextView) ;
adapter.getViewByPosition(recyclerView, position, R.id.tv_title);
Log.i("tag", "当前图片对应的 title=" + tv_title.getText());
}
});
//条目子控件长按事件
adapter.setOnItemChildLongClickListener(new BaseQuickAdapter.OnItemChildLongClickListener() {
@Override
public boolean onItemChildLongClick(BaseQuickAdapter adapter, View view, int position) {
Toast.makeText(MainActivity.this, "长按了第" + position + "条条目的图片", Toast.LENGTH_SHORT).show();
TextView tv_title = (TextView) ;
adapter.getViewByPosition(recyclerView, position, R.id.tv_title);
Log.i("tag", "长按的图片对应的title=" + tv_title.getText());
return false;
}
});
注意:如果有header的话需要处理一下position加上 headerlayoutcount。
- 最后,点击事件基本就完了