RecyclerView多条目

来源:互联网 发布:休闲皮鞋知乎 编辑:程序博客网 时间:2024/06/04 20:56
RecyclerView多条目实现:
需要依赖:compile 'com.android.support:recyclerview-v7:26.0.0-alpha1'
然后在,MainActivity中给每个item做添加数据的方法
然后调用他的适配器继承RecyclerView.Adapter<RecyclerView.ViewHolder>
给他设置一个bean类初始化他每个item的数据
创建每个item的ViewHolder类并且创建他的基类用来初始化他的item布局的控件
在设配器类中的onCreateViewHolder方法中添加他们不同item的布局然后在onBindViewHolder
通过调用基类来调用到每个item控件的类来实现数据添加到适配器中
最后则是把适配器在MainActivity中调用添加到RecyclerView中另外哦可以用判断使RecyclerView
实既有 GridView效果又有listview效果
MainActivity:
/**
* 实现Recycleview多布局效果
* 1.搭建环境(添加依赖,添加控件,初始化控件)
* 2.初始化数据
* 3.创建适配器
* 4.设置适配器,布局管理器
*/
public class MainActivity extends AppCompatActivity {

private RecyclerView recyclerView;
private List<DataModel> list;
int colors[] = {android.R.color.holo_blue_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light};
private DemoAdapter madapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
//初始化数据
initData();
//创建适配器
madapter = new DemoAdapter(this, list);
//设置适配器
recyclerView.setAdapter(madapter);
//设置布局管理器,否则无法正常显示 1.上下文2.规定排列顺序是横是竖,3.排列的正反顺序
// recyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));
//listview和gridview效果混排,无论一行两列还是一行一列都是gridlayoutmanager
//做了一个监听,根据不同类型,让其显示一行一列还是一行两列
final GridLayoutManager manager=new GridLayoutManager(this,2);
recyclerView.setLayoutManager(manager);
manager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
int type=recyclerView.getAdapter().getItemViewType(position);
if (type==DataModel.TYPE_THEE){
return manager.getSpanCount();
}else{
return 1;
}
}
});
}
/**
* Type:分类型
* string name
* string content
* color
*/
private void initData() {
//创建一个集合存放Bean类
list = new ArrayList<>();
//创建20条item
for (int i = 0; i < 20; i++) {
int type = 0;//= (int) (Math.random()*3+1);
if (i<5||i>15){
type=2;
}else if (i>5||i<8){
type=3;
}else if (i>=8||i<=15){
type=1;
}
//创建Bean类
DataModel data=new DataModel();
//实际开发中,则是解析服务器拿到数据
data.avatarColor=colors[type-1];
data.type=type;
data.name=""+i;
data.content="Content"+i;
data.contentColor=colors[(type+1)%3];
list.add(data);
}
}
}
Bean类:
public class DataModel {
public static final int TYPE_ONE=1;
public static final int TYPE_TOW=2;
public static final int TYPE_THEE=3;
public int type;
public int avatarColor;
public String name;
public String content;
public int contentColor;
}
适配器类:

/**
* Created by 小亚 on 2017/9/8.
* RecvcleView多布局适配器
* 1.创建一个类继承RecycleView的
* 2.定义RecycleView.ViewHolder以方便多布局
* 3.创建三种类型的item布局及ViewHolder
* 4.使用GetitemViewType方法
* 5.在onCreateViewHolder和onBindViewHolder进行ViewHolder的创建,数据的判断加载
*
*/
class DemoAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
//布局填充器
private final LayoutInflater mLayoutInflater;
private List<DataModel> mList=new ArrayList<>();
//private Context Context;
private TypeOneViewHolder one;
private TypeTwoViewHolder two;
private TypeThreeViewHolder three;
DataModel data=new DataModel();
public DemoAdapter(Context Context, List<DataModel> list) {
mLayoutInflater = LayoutInflater.from(Context);
this.mList = list;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType){
case DataModel.TYPE_ONE:
one = new TypeOneViewHolder(mLayoutInflater.inflate(R.layout.item_type_one,parent,false));
return new TypeOneViewHolder( mLayoutInflater.inflate(R.layout.item_type_one,parent,false));
case DataModel.TYPE_TOW:
two = new TypeTwoViewHolder( mLayoutInflater.inflate(R.layout.item_type_two,parent,false));
return new TypeTwoViewHolder( mLayoutInflater.inflate(R.layout.item_type_two,parent,false));
case DataModel.TYPE_THEE:
three = new TypeThreeViewHolder(mLayoutInflater.inflate(R.layout.item_type_three,parent,false));
return new TypeThreeViewHolder( mLayoutInflater.inflate(R.layout.item_type_three,parent,false));
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
((TypeAbstractViewHolder)holder).bindHolder(mList.get(position));
}
//根据不同的Position位置返回不同类型
@Override
public int getItemViewType(int position) {
return mList.get(position).type;
}
@Override
public int getItemCount() {
return mList.size();
}
}
每个item控件的类:
/**
* Created by 小亚 on 2017/9/8.
*/

public class TypeOneViewHolder extends TypeAbstractViewHolder{
private TextView name;
private ImageView avatar;

public TypeOneViewHolder(View itemView) {
super(itemView);
avatar = (ImageView) itemView.findViewById(R.id.avatar);
name = (TextView) itemView.findViewById(R.id.name);
}

@Override
public void bindHolder(DataModel model) {
name.setText(model.name);
avatar.setBackgroundResource(model.avatarColor);
}

}
基类:

/**
* Created by 小亚 on 2017/9/8.
* 抽取基类的原则
* 1.子类共有的,且实现相同的逻辑,抽取到基类中
* 2.子类共有.但实现不同逻辑,抽象方法形式定义
*/

public abstract class TypeAbstractViewHolder extends RecyclerView.ViewHolder{
public TypeAbstractViewHolder(View itemView) {
super(itemView);
}
public abstract void bindHolder(DataModel model);
}