1. 程式人生 > >RecyclerView不一樣的多條目展示(用到了抽取基類,多型的思想)

RecyclerView不一樣的多條目展示(用到了抽取基類,多型的思想)

效果:有點醜哈,不過絲毫不印象我們的效果嘿嘿
在這裡插入圖片描述
進入正題,開始做
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());
    }
}

它們對應的佈局就不沾了為了介面簡潔