RecyclerView的优化和开源框架BaseRecyclerViewAdapterHelper的使用

RecyclerView的万能适配器

RecyclerView的万能适配器,需要使用自定义的holder类来完成,holder类需要继承RecyclerView.holder,在holder中重写方法和一个getView的自定义方法。
getView中找数据源集合中有没有对应的View,没有就添加后返回,有就直接返回。
在RecyclerView的adapter中添加了两个抽象方法,一个用来获取布局的id,一个用来绑定控件给布局,吧adapter变成抽象类,派生一个子类去实现两个抽象方法。
在子类中写对应的逻辑代码,然后把子类的适配器添加给RecyclerView。

holder的代码

public class BaseHoder extends RecyclerView.ViewHolder {

    private SparseArray<View> array = new SparseArray<>();

    public BaseHoder(@NonNull View itemView) {
        super(itemView);
    }

    public View getView(int id){
        View view = null;
        view = array.get(id);
        if (itemView == null){
            view = itemView.findViewById(id);
            array.append(id,view);
        }
        return view;
    }
}

RecyclerView的adapter的代码

public abstract class Baseadpater<T> extends RecyclerView.Adapter<BaseHoder> {

    private Context context;
    private List<T> data;

    public Baseadpater(Context context, List<T> data) {
        this.context = context;
        this.data = data;
    }

    public abstract int getlayoutid();

    @NonNull
    @Override
    public BaseHoder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(context).inflate(getlayoutid(),null);
        return new BaseHoder(v);
    }

    public abstract void bangding(BaseHoder baseholder, int i);

    @Override
    public void onBindViewHolder(@NonNull BaseHoder baseholder, int i) {
        bangding(baseholder,i);
    }

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

派生的子类的代码

public class Firstadpater extends Baseadpater<Integer>{
    private Context context;
    private List<Integer> strings;
    private List<String> strings2;

    public Firstadpater(Context context, List<Integer> data,List<String> strings2) {
        super(context, data);
        this.context = context;
        this.strings = data;
        this.strings2=strings2;
    }

    @Override
    public int getlayoutid() {
        return R.layout.item_layout;
    }

    @Override
    public void bangding(BaseHoder baseholder, int i) {

        ImageView imageView= (ImageView) baseholder.getView(R.id.pic_item);
        imageView.setImageResource(strings.get(i));

        TextView textView= (TextView) baseholder.getView(R.id.text_item);
        textView.setText(strings2.get(i));
    }

activity的代码

public class MainActivity extends AppCompatActivity {

    private RecyclerView recyId;
    private List<Integer> list1 = new ArrayList<>();
    private List<String> list2 = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        getSupportActionBar().hide();

        recyId = (RecyclerView) findViewById(R.id.recy_id);

        list1.add(R.mipmap.d1);
        list1.add(R.mipmap.d2);
        list1.add(R.mipmap.d3);
        list1.add(R.mipmap.d4);
        list1.add(R.mipmap.d5);

        list2.add("11111");
        list2.add("22222");
        list2.add("33333");
        list2.add("44444");
        list2.add("55555");

        Firstadpater firstadpater = new Firstadpater(MainActivity.this, list1, list2);
        LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
        recyId.setLayoutManager(linearLayoutManager);
        recyId.setAdapter(firstadpater);

RecyclerView的优化

RecyclerView从我们之前写的代码中,可以吧点击事件提到外部类,使用接口回调的方法进行传值,然后activity实现接口获取值。把方法提出来,activity实现点击事件的接口,在可以找到控件的地方设置点击的监听,里面用main.this代替。

BaseRecyclerViewAdapterHelper

BaseRecyclerViewAdapterHelper是第三方的适配器框架,需要导入2个依赖,一个在这个项目的build文件下,一个在整个modo的build文件下。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值