封裝RecyclerView的Adapter

ViewHolder

public class ViewHolder extends RecyclerView.ViewHolder {
    private SparseArray<View> mViews;//存放item中的控件
    private View mContentView;
    public int mLayoutId;

    public ViewHolder(@NonNull View itemView,int layoutId) {
        super(itemView);
        mContentView = itemView;
        mLayoutId = layoutId;
        mViews = new SparseArray<>();
    }

    public static ViewHolder get(Context context, ViewGroup parent, int layoutId){
        View itemView = LayoutInflater.from(context).inflate(layoutId,parent,false);
        ViewHolder holder = new ViewHolder(itemView,layoutId);
        return holder;
    }

    public <T extends View> T getView(int viewId){
        View view = mViews.get(viewId);
        if(view == null){
            view = mContentView.findViewById(viewId);
            mViews.put(viewId,view);
        }
        return (T) view;
    }

    public void setText(int viewId,String text){
        TextView textView = getView(viewId);
        textView.setText(text);
    }

    public ViewHolder setImageResource(int viewId,int resId){
        ImageView view = getView(viewId);
        view.setImageResource(resId);
        return this;
    }

    public ViewHolder setOnClickListener(int viewId,View.OnClickListener listener){
        View view = getView(viewId);
        view.setOnClickListener(listener);
        return this;
    }

    public ViewHolder setOnItemClickListener(View.OnClickListener listener){
        mContentView.setOnClickListener(listener);
        return this;
    }
    
}

BaseRecyclerAdapter

public abstract class BaseRecyclerAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
    protected Context mContext;
    protected int mLayoutId;
    protected List<T> mDatas;

    //給繼承他的子類調用
    public BaseRecyclerAdapter(Context context,List<T> datas){
        mContext = context;
        mDatas = datas;
    }

    //單個itemViewType
    public BaseRecyclerAdapter(Context context,int layoutId,List<T> datas){
        mContext = context;
        mLayoutId = layoutId;
        mDatas = datas;
    }


    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        ViewHolder viewHolder = ViewHolder.get(mContext,parent,mLayoutId);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        convert(holder,mDatas.get(position));
    }

    @Override
    public int getItemCount() {
        return mDatas.size();
    }
    
    public abstract void convert(ViewHolder holder,T t);
    
}

MultiItemBaseRecyclerAdapter(多種itemViewType)

public abstract class MultiItemBaseRecyclerAdapter<T> extends BaseRecyclerAdapter<T>{

    protected MultiItemTypeSupport<T> mMultiItemTypeSupport;

    public MultiItemBaseRecyclerAdapter(Context context, List<T> datas,MultiItemTypeSupport multiItemTypeSupport) {
        super(context, datas);
        mMultiItemTypeSupport = multiItemTypeSupport;
    }

    @Override
    public int getItemViewType(int position) {
        return mMultiItemTypeSupport.getItemViewType(position,mDatas.get(position));
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        int layoutId = mMultiItemTypeSupport.getLayoutId(viewType);
        ViewHolder holder = ViewHolder.get(mContext,parent,layoutId);
        return holder;
    }

    interface MultiItemTypeSupport<T>{
        int getLayoutId(int itemType);//給不同的itemViewType類型設置不同的佈局id
        int getItemViewType(int position,T t);//根據集合判斷,給不同的itemViewType返回不同的類型
    }
}


使用

public class MainActivity extends AppCompatActivity {
    List<String> list = new ArrayList<>();
    List<String> list_double = new ArrayList<>();
    BaseRecyclerAdapter<String> adapter;
    MultiItemBaseRecyclerAdapter<String> adapter_double;

    @SuppressLint("WrongConstant")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        RecyclerView recyclerView = findViewById(R.id.recyclerView);
        RecyclerView recyclerView_double = findViewById(R.id.recyclerView_double);
        
        //單獨的列表
        LinearLayoutManager layoutManager= new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView.setLayoutManager(layoutManager);

        for(int i = 0;i<30;i++){
            list.add("測試文字"+i);
        }

        adapter = new BaseRecyclerAdapter<String>(this,R.layout.item_left,list) {
            @Override
            public void convert(ViewHolder holder, String s) {
                holder.setText(R.id.text,s);
            }
        };
        recyclerView.setAdapter(adapter);

        //多個ItemViewType
        LinearLayoutManager layoutManager1= new LinearLayoutManager(this);
        layoutManager1.setOrientation(LinearLayoutManager.VERTICAL);
        recyclerView_double.setLayoutManager(layoutManager1);

        addList();
        adapter_double = new MultiItemBaseRecyclerAdapter<String>(this,list_double,multiItemTypeSupport) {
            @Override
            public void convert(ViewHolder holder, String s) {
                holder.setText(R.id.text,s);
            }
        };
        recyclerView_double.setAdapter(adapter_double);


    }

    private void addList(){
        String[] strings = new String[]{"在麼","在","喫過飯了麼","沒","你在幹嘛","看電視","看什麼電視","海綿寶寶","海綿寶寶","好看麼","不好看"};
        list_double = Arrays.asList(strings);
    }

    private MultiItemBaseRecyclerAdapter.MultiItemTypeSupport multiItemTypeSupport = new MultiItemBaseRecyclerAdapter.MultiItemTypeSupport() {
        @Override
        public int getLayoutId(int itemType) {
            switch(itemType){
                case 0:
                    return R.layout.item_left;
                case 1:
                    return R.layout.item_right;
                default:
                    return -1;
            }
        }

        @Override
        public int getItemViewType(int position, Object o) {
            return (position%2==0)?0:1;
        }
    };

}

多種itemViewType

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章