虽然说我是小垃圾,但是谁又不是从小垃圾来的呢,言归正传,这几天一直也没更新,倒不是偷懒(虽然我师傅是说我偷懒来着),主要是这个适配器太难了,就是小小的休息一下.....,好了,这回说正事了。首先呢我们需要将想要的json数据在android studio中Java类中进行赋值给一个变量,之后需要初始化Gson方法,具体初始化是这样做的,Gson gson = new Gson();什么?为啥要初始化这个方法,我哪知道,我问我师傅但是我一点没记住。在初始化方法之后我们需要调用这个方法中的fromJson方法,具体是我这样调用的,ArrayList<GOSBean>gosbean = gsom.fromJson(json,new TypeToken<ArrayList<GOSBean>>(){}.getType());好了,我们详细解析一下这段语句,ArrayList<GOSBean>是给gosbean声明一个类型,其中GOSBean是需要你新建一个类的这个类里面将你的json数据转化为对象的属性,并且赋予get和set方法,也就是相当于使用数组列表的GOSBean的泛型来声明了gosbean,之后对gosbean进行赋值操作,赋值的时候就需要使用到初始化方法中的gson了,使用gson中的fromJson方法,来解析json数据,fromJson有两个属性,分别是String json, Type typeOfT这两个属性,第一个属性是你要解析的json数据json,第二个属性相当于声明了这个要解析属性的类型,详见源码。
Gson gson = new Gson(); ArrayList<GOSBean>gosBeans = gson.fromJson(json,new TypeToken<ArrayList<GOSBean>>(){}.getType());
好了,当我们解析了json数据之后,我们就可以为之前学习设置的子布局设置一个布局的样式了
GridLayoutManager gridLayoutManager = new GridLayoutManager(DynamicActivity.this,1){ @Override public boolean canScrollVertically() { return true; } }; dy.setLayoutManager(gridLayoutManager);
这个是源码,布局样式就是这么写的,别问为什么,我老师说的,要问问他去。对了其中的dy是我子布局的id
然后我们需要为这个子布局设置一个适配器
DynamicAdapter dynamicAdapter = new DynamicAdapter(gosBeans); dy.setAdapter(dynamicAdapter);
这个适配器是需要以对象的方式进行调用才可以设置的,在设置好了之后,我们有需要新建一个DynamicAdapter类,也就是适配器的类
然后我们在适配器的类中进行编写,这个类需要继承
RecyclerView.Adapter<DynamicAdapter.ViewHolder>
说多无益 我直接上源码
public class DynamicAdapter extends · <DynamicAdapter.ViewHolder> { private ArrayList<GOSBean>gosBeans; public DynamicAdapter(ArrayList<GOSBean> gosBeans) { this.gosBeans = gosBeans; } @NonNull @Override public DynamicAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_dy_style,parent,false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; } @Override public void onBindViewHolder(@NonNull DynamicAdapter.ViewHolder holder, int position) { holder.tv_name.setText(gosBeans.get(position).getName()); } @Override public int getItemCount() { return gosBeans.size(); } class ViewHolder extends RecyclerView.ViewHolder{ private final TextView tv_name; public ViewHolder(@NonNull View itemView) { super(itemView); tv_name = itemView.findViewById(R.id.tv_name); } }
咱们一行一行的来解析,第一行也就是我说的继承,继承这个RecyclerView.Adapter是因为我的子布局是RecyclerView布局而Adapter是适配器的意思,可以理解为我设置的子布局的适配器,至于后面声明的那个泛型 <DynamicAdapter.ViewHolder> 啥意思,我也不知道,有会的可以帮老弟解答一下,然后咱们看第二行,这个就简单了,这个就是把你在适配器中传过来的gosBeans声明一下,让编译器知道他是谁,之后我们需要一个构造器来构造一下这个gosBeans的属性,也就是
public DynamicAdapter(ArrayList<GOSBean> gosBeans) { this.gosBeans = gosBeans; }
什么什么,英语记不住,我师父教我个大招,你在传入对象的时候直接Alt+回车就出来这个方法了
至this.gosBeans = gosBeans就是将方法中的 gosBeans 赋值给了父类中的 gosBeans,然后暂满看onCreateViewHolder这个方法,这个就简单了,这个就是找ID,找到你子布局对应的那个布局的ID,至于为啥这么找,我不知道,师傅说了但是我忘记了,然后就是onBindViewHolder这个方法,这个方法可了不得,我被罚抄15遍,直接看方法体
holder.tv_name.setText(gosBeans.get(position).getName());
你看出啥了,对啥也看不出来,这个的意思就是Holder中的tv_name设置他的文字,然后就是在gosBeans对象中获取他的角标position,然后替换为Json数据的key也就是getName。
至于tv_name哪里来的 下面再说。
最后就是getItemCount方法了,这个就简单了,就是返回的个数
然后关键来了,我们需要创建一个内部类继承RecyclerView.ViewHolder,为啥继承他,别问我,我也不知道,
class ViewHolder extends RecyclerView.ViewHolder{
private final TextView tv_name;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tv_name = itemView.findViewById(R.id.tv_name);
} }
继承了之后创建一个方法然后继承他的父类itemView就行了,之后我们需要在这个itemView(我理解是所有的页面的父类)里面找到你在子布局中为你布局的控件设置的ID,然后这个ID用一个属性来存储我用的是tv_name,这个属性也就是我在onBindViewHolder方法中使用的属性这样才能完成替换嘛。要不咋替换,想的还挺美,就得这么整。行了,我师傅说我瞎比比,我就不百话了,愿对你们有帮助