RecycleView加载不同条目
来源:互联网 发布:百度seo排名点击软件 编辑:程序博客网 时间:2024/05/01 06:37
最近找工作,总结知识点,需求是RecycleVIew的使用,在简书上找到一篇文章写得很好,拿来使用一下,方便学习.重复使用一个布局很多次,单单是布局的话用include就可以了,但是逻辑也要复用,而且提出了使用listview复用条目优化性能,想做成一个自定义控件。我尝试了下,感觉直接用recycleview应该也是可以的。
效果展示
实现思路
- 添加依赖
com.android.support:recyclerview-v7:24.2.0 - 根据需求创建三个不同类型的item对应的布局文件
- 为每个类型的item创建数据bean类
- 创建通用的item数据bean类
- 为每个类型的item创建viewholder
- 创建Adapter类
- 在Activity使用recycleview
1.创建不同的item布局文件
- 包括一个编辑框子项,一个按钮子项,一个下拉列表子项。
布局文件就不放出来了,类似模仿下就可以。源代码项目中有。
2. 为每个类型的item创建数据bean类
- 封装了每个item需要赋值的数据。
3. 创建通用的item数据bean类
- 我们需要一个通用的数据项RecycleViewItemData来方便我们使用和进行子项的类型判断。
public class RecycleViewItemData<T> { //用来装载不同类型的item数据bean T t; //item数据bean的类型 int dataType; public RecycleViewItemData () { } public RecycleViewItemData (T t, int dataType) { this.t = t; this.dataType = dataType; } public T getT () { return t; } public void setT (T t) { this.t = t; } public int getDataType () { return dataType; } public void setDataType (int dataType) { this.dataType = dataType; }}
3. 为每个类型的item创建viewholder
EditViewHolder
public class EditViewHolder extends RecyclerView.ViewHolder { public TextView mTextView1; public TextView mTextView2; public EditText mEditText1; public EditText mEditText2; public EditViewHolder(View itemView) { super(itemView); mTextView1 = (TextView) itemView.findViewById(R.id.text1); mTextView2 = (TextView) itemView.findViewById(R.id.text2); mEditText1 = (EditText) itemView.findViewById(R.id.editText1); mEditText2 = (EditText) itemView.findViewById(R.id.editText2); } }
- SpinnerHolder
public class SpinnerHolder extends RecyclerView.ViewHolder { public SpinnerHolder(View itemView) { super(itemView); } }
略。。。
4. 创建Adapter类
RecycleView的Adapter中需要重写方法的简单介绍
- 构造方法:一般用于接收数据集
- onCreateViewHolder:
创建ViewHolder,该方法会在RecyclerView需要展示一个item的时候回调。重写该方法时,应该使ViewHolder加载item view的布局。- onBindeViewHolder:
该方法在RecyclerView在特定位置展示数据时候回调。把数据绑定、填充到相应的item view中。- getItemCount
返回数据的数量。- getItemViewType(int position) 注:需要时重写
从这个方法中所返回的值会在onCreateViewHolder中用到。比如头部,尾部,等等的特殊itemView(这里说成ViewHolder比较好)都可以在这里进行判断。
public class Madapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int TYPE_EDIT = 0;//编辑框 private static final int TYPE_BUTTON = 1;//按钮 private static final int TYPE_SPINNER = 2;//下拉列表 private ArrayList<RecycleViewItemData> dataList;//数据集合 public Madapter(ArrayList<RecycleViewItemData> dataList) { this.dataList = dataList; } //用来创建ViewHolder @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { //如果viewType是编辑框类型,则创建EditViewHolder型viewholder if (viewType == TYPE_EDIT) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_creditcard_edit, parent, false); EditViewHolder viewHolder = new EditViewHolder(view); return viewHolder; } //如果viewType是按钮类型,则创建ButtonViewHolder型viewholder if (viewType == TYPE_BUTTON) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_creditcard_button, parent, false); ButtonViewHolder viewHolder = new ButtonViewHolder(view); return viewHolder; } //如果viewType是下拉列表类型,则创建SpinnerHolder型viewholder if (viewType == TYPE_SPINNER) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_creditcard_spinner, parent, false); SpinnerHolder viewHolder = new SpinnerHolder(view); return viewHolder; } return null; } //用来绑定数据 @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { //如果holder是EditViewHolder的实例 if (holder instanceof EditViewHolder) { //得到对应position的数据集 EditItem mEditItem = (EditItem) dataList.get(position).getT(); if (position == 0) { ((EditViewHolder) holder).mTextView1.setText("* Holder Name"); ((EditViewHolder) holder).mTextView2.setText("* Card Number"); } else if (position == 3) { ((EditViewHolder) holder).mTextView1.setText(" * Street "); ((EditViewHolder) holder).mTextView2.setText(" * City "); } else if (position == 5) { ((EditViewHolder) holder).mTextView1.setText(" Or "); ((EditViewHolder) holder).mTextView2.setText(" * Zipcode "); } ((EditViewHolder) holder).mEditText1.setText(mEditItem.getText1()); ((EditViewHolder) holder).mEditText2.setText(mEditItem.getText2()); } //如果holder是ButtonViewHolder的实例 if (holder instanceof ButtonViewHolder) { //从数据集合中取出该项 ButtonItem mButtonItem = (ButtonItem) dataList.get(position).getT(); //设置选中的按钮 switch (mButtonItem.getPosition()) { case 0: ((ButtonViewHolder) holder).mRadioButton.setChecked(true); break; case 1: ((ButtonViewHolder) holder).mRadioButton2.setChecked(true); break; case 2: ((ButtonViewHolder) holder).mRadioButton3.setChecked(true); break; } } //如果holder是SpinnerHolder的实例 if (holder instanceof SpinnerHolder) { } } @Override public int getItemViewType(int position) { if (0 == dataList.get(position).getDataType()) { return TYPE_EDIT;// 编辑框 } else if (1 == dataList.get(position).getDataType()) { return TYPE_BUTTON;// 按钮 } else if (2 == dataList.get(position).getDataType()) { return TYPE_SPINNER;//下拉列表 } else { return 0; } } @Override public int getItemCount() { return dataList.size(); }}
5. 在Activity使用recycleview
public class MainActivity extends AppCompatActivity { private ArrayList<RecycleViewItemData> dataList; @BindView(R.id.creditcard) RecyclerView mCreditcard; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); mCreditcard.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); dataList=new ArrayList<RecycleViewItemData>(); dataList.add(new RecycleViewItemData(new EditItem("aaa","bbb"),0)); dataList.add(new RecycleViewItemData(new ButtonItem(1),1)); dataList.add(new RecycleViewItemData(new SpinnerItem("aaa","bbb"),2)); dataList.add(new RecycleViewItemData(new EditItem("aaa","bbb"),0)); dataList.add(new RecycleViewItemData(new SpinnerItem("aaa","bbb"),2)); dataList.add(new RecycleViewItemData(new EditItem("aaa","bbb"),0)); mCreditcard.setAdapter(new Madapter(dataList)); }}
0 0
- RecycleView加载不同条目
- RecycleView加载不同条目
- RecycleView多条目加载
- RecycleView多条目加载
- RecycleView多条目加载
- recycleview的多条目加载
- Recycleview实现多条目加载布局
- RecycleView加载不同的布局
- ListView加载不同的条目
- recycleView 多条目加载 + 下拉刷新 +GridView 与 ListView 切换
- 为ListView控件加载不同的条目
- RecycleView实现多条目
- recycleview条目点击事件
- RecycleView的多条目
- 使用RecycleView删除条目 以及动画条目
- 如何避免RecycleView复杂多条目布局时的加载不流畅
- recycleview条目的背景选择器
- recycleView的条目长按换位置
- MySQL笔记-trigger与index
- Mycat生产实践---性能调优
- 在原型设计上,UI和UX设计师有哪三个区别?
- 求凸包上最远两点距离的平方值
- 关于XML文档的xmlns、xmlns:xsi和xsi:schemaLocation
- RecycleView加载不同条目
- 求凸包周长
- imx6 yocto编译备忘
- React-native学习过程 一 改变文字,添加图片
- RSS 教程
- 慎用百度!!!搜出来的资料坑死人!
- OOP/第三章 多态
- 155. Min Stack
- jvm堆外直接内存实现高性能接入层