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 = 0; i < 50; 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);
        }
    }

这里我才用了两种方式的调用都是可以的,不明白的童鞋欢迎留言。

猜你喜欢

转载自blog.csdn.net/u011048906/article/details/79368756