天天看點

RecyclerView打造萬能擴充卡

這篇文章其實不用圖檔但是出于喜歡貼圖就貼出一副不太美觀的清單把

RecyclerView打造萬能擴充卡

1.首先我們需要寫一個共通的viewHolder用來完成我們對于view的各種操作

/**
 * Created by Administrator on 2018/2/25.
 * 共通viewHolder用來完成各種view的操作
 * 下面的功能比較少需要的童鞋可以根據自身業務需求添加方法
 */
public class CommonViewHolder extends RecyclerView.ViewHolder {
    private View itemView;

    public CommonViewHolder(View itemView) {
        super(itemView);
        this.itemView = itemView;
    }

    public View getView(int id) {
        return itemView.findViewById(id);
    }

    public CommonViewHolder setText(int id, CharSequence text) {
        ((TextView) getView(id)).setText(text);
        return this;
    }
}
           

2.之後我們需要添加一個MultiTypeSupport類用于通過資料或者position來控制我們的的item布局類型

public interface MultiTypeSupport<T> {
    public int getViewId(T t, int position);
}
           

3.再然後我們就是要完成我們的共通adapter了

/**
 * Created by Administrator on 2018/2/25.
 * 共通Adapter
 */
public abstract class CommonAdapter<T> extends RecyclerView.Adapter<CommonViewHolder> {
    private List<T> dates;//資料
    private LayoutInflater inflater;//布局inflater
    private int viewId;//布局的id

    private MultiTypeSupport<T> typeSupport;//多布局支援

    public CommonAdapter(Context context, List<T> dates, int viewId) {
        this.dates = dates;
        this.viewId = viewId;
        inflater = LayoutInflater.from(context);
    }

    public CommonAdapter(Context context, List<T> dates, MultiTypeSupport<T> typeSupport) {
        this.dates = dates;
        this.typeSupport = typeSupport;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public int getItemViewType(int position) {
        //多布局支援添加
        if (typeSupport != null) {
            return typeSupport.getViewId(dates.get(position), position);
        }
        return super.getItemViewType(position);
    }

    @Override
    public CommonViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        //多布局支援添加
        if (typeSupport != null) {
            viewId = viewType;
        }
        return new CommonViewHolder(inflater.inflate(viewId, null));
    }

    @Override
    public void onBindViewHolder(CommonViewHolder holder, int position) {
        bindTheViewHolder(holder, dates.get(position));
    }

    public abstract void bindTheViewHolder(CommonViewHolder holder, T date);

    @Override
    public int getItemCount() {
        return dates.size();
    }
}
           

4.最後是我們的activity中的調用

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main2);
        final List<String> items = new ArrayList<>();
        for (int i = ; i < ; i++) {
            items.add("-----" + i + "-----");
        }
        RecyclerView rc_main = (RecyclerView) findViewById(R.id.rc_main);
        rc_main.setLayoutManager(new LinearLayoutManager(Main2Activity.this, LinearLayoutManager.VERTICAL, false));
//        rc_main.setAdapter(new MyAdapter(Main2Activity.this, items, R.layout.item_vg));
        rc_main.setAdapter(new MyAdapter(Main2Activity.this, items, new MultiTypeSupport<String>() {
            @Override
            public int getViewId(String s, int position) {
                return R.layout.item_vg;
            }
        }));
    }

    class MyAdapter extends CommonAdapter<String> {
        public MyAdapter(Context context, List<String> dates, MultiTypeSupport<String> typeSupport) {
            super(context, dates, typeSupport);
        }
        /*MyAdapter(Context context, List<String> dates, int viewId) {
            super(context, dates, viewId);
        }
        */

        @Override
        public void bindTheViewHolder(CommonViewHolder holder, String date) {
            holder.setText(R.id.tv_content, date);
        }
    }
           

這裡我才用了兩種方式的調用都是可以的,不明白的童鞋歡迎留言。

繼續閱讀