RecyclerView不一樣的多條目展示(用到了抽取基類,多型的思想)
阿新 • • 發佈:2018-12-20
效果:有點醜哈,不過絲毫不印象我們的效果嘿嘿
進入正題,開始做
1.匯入依賴
implementation 'com.android.support:recyclerview-v7:28.0.0'
2.寫佈局並初始化控制元件
<android.support.v7.widget.RecyclerView android:id="@+id/recyclerView_main" android:layout_width="match_parent" android:layout_height="match_parent"/>
3.因為我是做的demo所以這裡手動模擬資料
bean類程式碼
/** * date:2018/11/30 * author:輝(家輝輝輝) * function:模擬資料的bean */ public class DataModel { //條目的型別 public static final int TYPE_ONE = 0; public static final int TYPE_TWO = 1; public static final int TYPE_THREE = 2; //型別數量 private int type; private int avatarColor; private String name; private String content; private int contentColor; public DataModel() { } public DataModel(int type, int avatarColor, String name, String content, int contentColor) { this.type = type; this.avatarColor = avatarColor; this.name = name; this.content = content; this.contentColor = contentColor; } public static int getTypeOne() { return TYPE_ONE; } public static int getTypeTwo() { return TYPE_TWO; } public static int getTypeThree() { return TYPE_THREE; } public int getType() { return type; } public void setType(int type) { this.type = type; } public int getAvatarColor() { return avatarColor; } public void setAvatarColor(int avatarColor) { this.avatarColor = avatarColor; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public int getContentColor() { return contentColor; } public void setContentColor(int contentColor) { this.contentColor = contentColor; } }
4.main程式碼
public class MainActivity extends AppCompatActivity { private RecyclerView mRecyclerView; private int colors[] = {R.color.colorAccent,R.color.colorPrimary,R.color.colorAccent}; private List<DataModel> list; private MyRecyclerAdapter adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //初始化控制元件 mRecyclerView = findViewById(R.id.recyclerView_main); //載入資料 loadData(); //初始化介面卡 initAdapter(); } private void initAdapter() { //建立介面卡 adapter = new MyRecyclerAdapter(this); //設定資料 adapter.setData(list); //設定介面卡 mRecyclerView.setAdapter(adapter); //設定佈局管理器 mRecyclerView.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false)); } //模擬資料 private void loadData() { //建立一個集合存放Bean類 list = new ArrayList<>(); //迴圈新增資料 for(int i=0 ; i < 25 ; i++){ int type ; //手動設定type的數量 if( i < 5 || (i > 15 && i< 20)){ type = 0 ; } else if( i < 10 || i > 16){ type = 1; }else{ type = 2 ; } //使用random隨機生成三種類型中的任意一種 /*int type = (int)Math.random() * 3 + 1;*/ //通過有參傳入引數 DataModel dataModel = new DataModel(type, colors[type], "item" + i, "Countent" + i, colors[(type + 1) % 3]); //新增到集合中 list.add(dataModel); } } }
5.adapter程式碼
/**
* date:2018/11/30
* author:輝(家輝輝輝)
* function:介面卡
*/
public class MyRecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private List<DataModel> mData;
private Context mContext;
public MyRecyclerAdapter(Context context) {
mContext = context;
mData = new ArrayList<>();
}
//設定資料
public void setData(List<DataModel> data){
mData.clear();
if(data != null){
mData.addAll(data);
}
notifyDataSetChanged();
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
//根據型別 i 判斷並載入佈局
switch (i){
case DataModel.TYPE_ONE:
View view = View.inflate(mContext, R.layout.viewholder_one, null);
//宣告並例項化並傳入佈局
ViewHolder_one viewHolder_one = new ViewHolder_one(view);
//返回物件
return viewHolder_one;
case DataModel.TYPE_TWO:
View view1 = View.inflate(mContext, R.layout.viewholder_two, null);
ViewHolder_Two viewHolder_two = new ViewHolder_Two(view1);
return viewHolder_two;
case DataModel.TYPE_THREE:
View view2 = View.inflate(mContext, R.layout.viewholder_three, null);
ViewHolder_three viewHolder_three = new ViewHolder_three(view2);
return viewHolder_three;
}
return null;
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
//獲取每一個子類的資料
((ViewHolder_Base)viewHolder).onBind(mData.get(i));
}
@Override
public int getItemCount() {
return mData.size();
}
@Override
public int getItemViewType(int position) {
return mData.get(position).getType();
}
}
6.viewHolder的基類
/**
* date:2018/11/30
* author:輝(家輝輝輝)
* function:viewHolder的基類
* 基類的抽取無非就是以下幾點:
* 1.抽取邏輯相同程式碼相同的
* 2.抽取邏輯不通程式碼相同的
*/
public abstract class ViewHolder_Base extends RecyclerView.ViewHolder {
public ViewHolder_Base(@NonNull View itemView) {
super(itemView);
}
//抽象方法將子類的邏輯相同的地方存入
public abstract void onBind(DataModel model);
}
7.第一個viewHolder
public class ViewHolder_one extends ViewHolder_Base{
private final ImageView image;
//找控制元件
public ViewHolder_one(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image_one);
}
@Override
public void onBind(DataModel model) {
image.setBackgroundResource(model.getAvatarColor());
}
}
8.第二個viewHolder
public class ViewHolder_Two extends ViewHolder_Base{
private final ImageView image;
private final TextView name;
public ViewHolder_Two(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image_two);
name = itemView.findViewById(R.id.name_two);
}
@Override
public void onBind(DataModel model) {
image.setBackgroundResource(model.getAvatarColor());
name.setText(model.getName());
}
}
9.最後一個
public class ViewHolder_three extends ViewHolder_Base{
private final ImageView image;
private final TextView name;
private final TextView date;
public ViewHolder_three(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image_three);
name = itemView.findViewById(R.id.name_three);
date = itemView.findViewById(R.id.date_three);
}
@Override
public void onBind(DataModel model) {
image.setBackgroundResource(model.getAvatarColor());
name.setText(model.getName());
date.setText(model.getContent());
}
}
它們對應的佈局就不沾了為了介面簡潔