Recyclerview添加头布局和尾布局、item点击事件详解
作者:段合江 时间:2022-04-19 12:38:12
简介:
本篇博客主要包括recyclerview添加多种布局以及添加头布局和尾布局,还有item点击事件
思路:
主要重写Recyclerview.Adapter中的一些方法
1.public int getItemCount() item熟练 +2(头布局和尾布局)
2.public int getItemViewType(int position) 判断position 设置itemType
3.创建不同的ViewHolder,分别用来加载头布局,正常布局,尾布局
4.public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) 根据viewType的不同返回不同的viewholder
5.public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) 根据holder的不同绑定不同的数据
案例:
主布局中只有一个Recyclerview,里面的item除了基本的两种类型,还有头布局和尾布局,点击基本类型跳转到另外一个Activity,显示图片
下面主要贴出Adapter和MainActivity中的代码,其他的布局文件,类比较简单就不贴出了
1.Adapter
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {
private Context context;
private List<Person> datas;
private static final int ITEM_ONE=1;
private static final int ITEM_TWO=2;
private static final int ITEM_HEAD=3;
private static final int ITEM_FOOT=4;
private int headViewCount=1;
private int footViewCount=1;
private OnItemClickListener onItemClickListener;
public MyAdapter(Context context, List<Person> datas) {
this.context = context;
this.datas = datas;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType==ITEM_HEAD){
View view= LayoutInflater.from(context).inflate(R.layout.item_head,parent,false);
return new HeaderViewHolder(view);
}else if(viewType==ITEM_FOOT){
View view=LayoutInflater.from(context).inflate(R.layout.item_foot,parent,false);
return new FootViewHolder(view);
}
else if(viewType==ITEM_ONE){
View view= LayoutInflater.from(context).inflate(R.layout.item_recyclerview,parent,false);
return new ViewHolder(view);
}else if(viewType==ITEM_TWO){
View view=LayoutInflater.from(context).inflate(R.layout.item_recyclerview2,parent,false);
return new ViewHolder(view);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if(holder instanceof HeaderViewHolder){
}else if(holder instanceof FootViewHolder){
}
else if(holder instanceof ViewHolder){
//注意除去头布局
holder.itemView.setTag(position-1);
holder.itemView.setOnClickListener(this);
((ViewHolder)holder).img.setBackgroundResource(datas.get(position-1).getImgId());
((ViewHolder)holder).tv1.setText(datas.get(position-1).getName());
((ViewHolder)holder).tv2.setText(datas.get(position-1).getDetail());
}
}
@Override
public int getItemCount() {
if(datas==null){
return headViewCount+footViewCount;
}
return datas.size()+headViewCount+footViewCount;
}
@Override
public int getItemViewType(int position) {
if(isHeadView(position)){
return ITEM_HEAD;
}
if(isFootView(position)){
return ITEM_FOOT;
}
if(position%2==0){
return ITEM_ONE;
}else{
return ITEM_TWO;
}
}
public boolean isHeadView(int position){
return headViewCount!=0&&position<headViewCount;
}
public boolean isFootView(int position){
return footViewCount!=0&&position>=(datas.size()+headViewCount);
}
@Override
public void onClick(View view) {
if(onItemClickListener!=null){
onItemClickListener.onItemClick(view, (Integer) view.getTag());
}
}
class ViewHolder extends RecyclerView.ViewHolder{
TextView tv1,tv2;
ImageView img;
public ViewHolder(View itemView) {
super(itemView);
tv1=itemView.findViewById(R.id.tv1);
tv2=itemView.findViewById(R.id.tv2);
img=itemView.findViewById(R.id.img);
}
}
class HeaderViewHolder extends RecyclerView.ViewHolder{
public HeaderViewHolder(View itemView) {
super(itemView);
}
}
class FootViewHolder extends RecyclerView.ViewHolder{
public FootViewHolder(View itemView) {
super(itemView);
}
}
public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
}
interface OnItemClickListener{
void onItemClick(View view,int position);
}
}
2.MainActivity
public class MainActivity extends AppCompatActivity implements MyAdapter.OnItemClickListener {
private RecyclerView recyclerView;
private List<Person> datas;
private MyAdapter adapter;
private int[] imgs={R.drawable.p1,R.drawable.p2,R.drawable.p3,R.drawable.p4,R.drawable.p5,R.drawable.pic1,
R.drawable.pic2,R.drawable.pic3,R.drawable.pic4,R.drawable.pic5,R.drawable.pic6};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView= (RecyclerView) findViewById(R.id.recyclerview);
initData();
initRecyclerView();
}
private void initRecyclerView() {
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter=new MyAdapter(this,datas);
adapter.setOnItemClickListener(this);
recyclerView.setAdapter(adapter);
}
private void initData() {
datas=new ArrayList<>();
for(int i=0;i<imgs.length;i++){
Person p=new Person();
p.setName("hahfa"+i);
p.setDetail("今天是星期一,还有5天才能休息"+i);
p.setImgId(imgs[i]);
datas.add(p);
}
}
@Override
public void onItemClick(View view, int position) {
Intent intent=new Intent(MainActivity.this,ImageActivity.class);
intent.putExtra("imgId",datas.get(position).getImgId());
startActivity(intent);
}
}
标签:Recyclerview,布局,点击事件
![](/images/zang.png)
![](/images/jiucuo.png)
猜你喜欢
C#中TreeView节点的自定义绘制方法
2023-04-01 10:37:19
心动吗?正大光明的免费使用IntelliJ IDEA商业版
2023-11-25 04:29:48
![](https://img.aspxhome.com/file/2023/6/59976_0s.jpg)
基于JWT.NET的使用(详解)
2021-07-09 22:15:25
![](https://img.aspxhome.com/file/2023/9/119459_0s.png)
Android自定义View控件实现刷新效果
2022-05-12 14:43:22
![](https://img.aspxhome.com/file/2023/7/138157_0s.png)
C#基于正则表达式删除字符串中数字或非数字的方法
2021-07-12 17:27:44
C++11 condition_variable条件变量的用法说明
2021-12-06 23:39:56
![](https://img.aspxhome.com/file/2023/9/117789_0s.png)
Mybatis 动态表名+Map参数传递+批量操作详解
2023-04-02 04:08:00
![](https://img.aspxhome.com/file/2023/1/92631_0s.jpg)
android中DatePicker和TimePicker的使用方法详解
2021-08-28 14:45:13
![](https://img.aspxhome.com/file/2023/3/106043_0s.png)
Android数据存储几种方式讲解
2023-09-25 19:00:35
![](https://img.aspxhome.com/file/2023/7/86747_0s.png)
浅析Java中comparator接口与Comparable接口的区别
2023-11-01 20:31:14
Android开发之RecyclerView控件
2023-08-14 08:57:37
![](https://img.aspxhome.com/file/2023/1/123291_0s.png)
c#单例模式(Singleton)的6种实现
2021-07-01 10:17:51
![](https://img.aspxhome.com/file/2023/7/89797_0s.gif)
Spring Boot环境下Mybatis Plus的快速应用操作
2023-04-08 13:27:33
C#多线程之线程池(ThreadPool)
2022-05-02 07:12:15
![](https://img.aspxhome.com/file/2023/0/108770_0s.png)
springboot:接收date类型的参数方式
2023-03-19 12:48:31
![](https://img.aspxhome.com/file/2023/0/85520_0s.png)
C#机器入门学习之判断日报是否合格详解
2023-03-24 01:55:08
![](https://img.aspxhome.com/file/2023/7/119477_0s.png)
浅析java中next与nextLine用法对比
2022-01-11 01:02:53
Android非XML形式动态生成、调用页面的方法
2022-11-11 11:26:01
SpringBoot 如何整合 ES 实现 CRUD 操作
2022-03-24 03:10:31
![](https://img.aspxhome.com/file/2023/6/108446_0s.png)
Python代码一键转Jar包及Java调用Python新姿势
2023-02-13 08:16:22
![](https://img.aspxhome.com/file/2023/4/96944_0s.jpg)