关于RecyclerView.ViewHolder和RecyclerView.Adapter

6 android android-viewholder android-5.0-lollipop android-recyclerview

  1. RecyclerView.ViewHolder类有一个字段是public final View itemView.它表示该onBindViewHolder方法应更新其内容itemView以反映给定位置的项目.final修饰符是否表示此字段的值不能更改?

  2. 以下代码来自教科书:

    public class ViewHolder extends RecyclerView.ViewHolder {
       ...
          @Override
          public int getItemCount() {
              ...
          }
          @Override
          public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int    viewType) {
             ...
          }
          @Override
          public void onBindViewHolder(ViewHolder viewHolder, int position) {
             ...
          }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    为什么这里的这些方法可以覆盖RecyclerView.AdapterRecyclerView.ViewHolder类派生的类中的方法?

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.Adapter.html

https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html

有人可以解释一下吗?

谢谢.

xia*_*omi 10

最终修饰符是否表示此字段的值不能更改?

View上的最终修饰符表示您只能启动视图一次(通过创建新的View(上下文)或从xml文件中扩展视图).但您仍然可以修改视图属性.(即您的视图包含TextView,您可以设置文本)

对于您的第二个问题,教科书对于如何使用视图持有者实现适配器并不十分精确.这是一个带有自定义视图持有者的适配器的简单实现.

public class Adapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{

    private List<String> titles;

    public Adapter(List<String> titles) {
        this.titles = titles;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        return new MyViewHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_view, viewGroup, false));
    }

    @Override
    public void onBindViewHolder(MyViewHolder myViewHolder, int i) {
        String title = titles.get(i);
        myViewHolder.title.setText(title);
    }

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

    public static class MyViewHolder extends RecyclerView.ViewHolder {

        TextView title;

        public MyViewHolder(View itemView) {
            super(itemView);

            title = (TextView) itemView.findViewById(R.id.title_TV);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

和它的xml文件:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent" android:layout_height="match_parent">

    <TextView
        android:id="@+id/title_tv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

您可以看到,如果扩展RecyclerView.Adapter,则必须覆盖这3种方法.

希望这将有助于您了解更多RecyclerView.