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文件下。