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,显示图片

Recyclerview添加头布局和尾布局、item点击事件详解

下面主要贴出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,布局,点击事件
0
投稿

猜你喜欢

  • C#中TreeView节点的自定义绘制方法

    2023-04-01 10:37:19
  • 心动吗?正大光明的免费使用IntelliJ IDEA商业版

    2023-11-25 04:29:48
  • 基于JWT.NET的使用(详解)

    2021-07-09 22:15:25
  • Android自定义View控件实现刷新效果

    2022-05-12 14:43:22
  • C#基于正则表达式删除字符串中数字或非数字的方法

    2021-07-12 17:27:44
  • C++11 condition_variable条件变量的用法说明

    2021-12-06 23:39:56
  • Mybatis 动态表名+Map参数传递+批量操作详解

    2023-04-02 04:08:00
  • android中DatePicker和TimePicker的使用方法详解

    2021-08-28 14:45:13
  • Android数据存储几种方式讲解

    2023-09-25 19:00:35
  • 浅析Java中comparator接口与Comparable接口的区别

    2023-11-01 20:31:14
  • Android开发之RecyclerView控件

    2023-08-14 08:57:37
  • c#单例模式(Singleton)的6种实现

    2021-07-01 10:17:51
  • Spring Boot环境下Mybatis Plus的快速应用操作

    2023-04-08 13:27:33
  • C#多线程之线程池(ThreadPool)

    2022-05-02 07:12:15
  • springboot:接收date类型的参数方式

    2023-03-19 12:48:31
  • C#机器入门学习之判断日报是否合格详解

    2023-03-24 01:55:08
  • 浅析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
  • Python代码一键转Jar包及Java调用Python新姿势

    2023-02-13 08:16:22
  • asp之家 软件编程 m.aspxhome.com