文章目录
RecyclerView
Adapter
Adapter是数据适配器,用来给Recyclerview填充数据的。可以一个Adapter对应一个Recyclerview,也可以一个Adapater对应多个Recyclerview。
步骤:
- 自己实现一个XXXAdapter,extends自 RecyclerView.Adapte<>,泛型为一个ViewHolder内部类。
public class ExchangeListAdapter extends RecyclerView.Adapter<ExchangeListAdapter.VH>
ViewHolder内部类
在ViewHolder内部类的构造器中进行绑定视图的操作,并把自定义的VH填入父级Adapter的泛型参数中。
步骤:
- 自己实现一个VH,extends自RecyclerView.ViewHolder。
public static class VH extends RecyclerView.ViewHolder{
public final TextView Title;
public final TextView Current;
public final ImageView Pic;
public VH(View v){
super(v);
Title = (TextView)v.findViewById(R.id.List_Title);
Current = (TextView)v.findViewById(R.id.List_Current);
Pic = v.findViewById(R.id.List_Pic);
}
}
- 在构造器中绑定需要用到的Title、Pic等视图元素。
Adapter的构造器
Adapter的默认构造器可以从外部传入需要的数据,并设置到Adapter的变量中(通常是ArrayList)
private List<String> TitleArray;
private List<String> CurrentArray;
public ExchangeListAdapter(List<String> data1,List<String> data2){
this.TitleArray = data1;
this.CurrentArray = data2;
}
需要重载的方法
-
onBindViewHolder(VH vh,int i)
用实际的数据组(ArrayList等)对Recyclerview的UI进行操作
@Override public void onBindViewHolder(@NonNull VH vh, int i) { vh.Title.setText(TitleArray.get(i)); vh.Current.setText(CurrentArray.get(i)); switch (i){ case 0:vh.Pic.setImageResource(R.drawable.cny); break; case 1:vh.Pic.setImageResource(R.drawable.usd); break; case 2:vh.Pic.setImageResource(R.drawable.hkd); break; case 3:vh.Pic.setImageResource(R.drawable.eur); break; case 4:vh.Pic.setImageResource(R.drawable.jpy); break; case 5:vh.Pic.setImageResource(R.drawable.gbp); break; case 6:vh.Pic.setImageResource(R.drawable.krw); break; case 7:vh.Pic.setImageResource(R.drawable.cad); break; case 8:vh.Pic.setImageResource(R.drawable.aud); break; case 9:vh.Pic.setImageResource(R.drawable.twd); break; } }
-
getItemCount()
返回Recyclerview的数据总数
@Override public int getItemCount() { return TitleArray.size(); }
-
onCreateViewHolder(ViewGroup viewGroup,int i)
选择Recyclerview的布局文件,并传入这个文件到ViewHolder的构造器中。
@Override public VH onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) { View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.exchange_list,viewGroup,false); return new VH(v); } }
Recyclerview元素布局文件
这是一个xml文件,部署在layout目录中,一般是一个Linerlayout或者Relativelayout,代表Recyclerview中的一行。可以使用margin属性控制Recyclerview的每行高度。
<RelativeLayout
xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent">
<ImageView
android:layout_width="21dp"
android:layout_height="21dp"
android:layout_alignBottom="@id/List_Title"
android:id="@+id/List_Pic"/>
<TextView
android:layout_toRightOf="@id/List_Pic"
android:layout_marginLeft="4dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/List_Title"
android:textStyle="bold"
android:textSize="16sp"
android:text="hello"
android:layout_margin="4dp"/>
<TextView
android:layout_marginLeft="210dp"
android:layout_marginBottom="4dp"
android:layout_marginRight="5dp"
android:layout_marginTop="4dp"
android:textSize="16sp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/List_Current"
android:text="world"/>
</RelativeLayout>
Activity或者Fragment中调用Recyclerview
主要步骤:
-
绑定Recyclerview
-
设置布局管理器LayoutManager
-
new一个Adapter并设置
-
设置装饰器(可选)
recyclerView = v.findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); ExchangeListAdapter exchangeListAdapter = new ExchangeListAdapter(Title, Current); recyclerView.setAdapter(exchangeListAdapter); recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));