简体   繁体   English

关于RecyclerView.ViewHolder和RecyclerView.Adapter

[英]About RecyclerView.ViewHolder and RecyclerView.Adapter

  1. The RecyclerView.ViewHolder class has a field that is public final View itemView . RecyclerView.ViewHolder类有一个public final View itemView的字段。 It says that the onBindViewHolder method should update the contents of the itemView to reflect the item at the given position . 上面说的是onBindViewHolder方法应该更新的内容itemView在给定的位置,以反映该项目。 Doesn't the final modifier indicate that the value of this field cannot change ? final修饰符是否表示此字段的值不能更改?

  2. The code below is from the textbook : 以下代码来自教科书:

     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) { ... } } 

    Why do these methods here can override the methods in the RecyclerView.Adapter class which is derived from the RecyclerView.ViewHolder class ? 为什么这些方法在这里可以覆盖的方法RecyclerView.Adapter这是从派生类RecyclerView.ViewHolder类?

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

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

Could someone explain it ? 有人可以解释一下吗?

Thank you. 谢谢。

Doesn't the final modifier indicate that the value of this field cannot change ? 最终修饰符是否表示此字段的值不能更改?

The final modifier on a View indicate that you can only initiate the view once (by creating a new View(context) or inflate a view from an xml file). View上的最终修饰符表示您只能启动视图一次(通过创建新的View(上下文)或从xml文件中扩展视图)。 But you can still modify the view property. 但您仍然可以修改视图属性。 (ie your view contains a TextView, you can set the text) (即您的视图包含TextView,您可以设置文本)

For your second question, the text book is not very precise about how to implement the adapter with a view holder. 对于您的第二个问题,教科书对于如何使用视图持有者实现适配器并不十分精确。 Here is a simple implementation of an adapter with a custom view holder. 这是一个带有自定义视图持有者的适配器的简单实现。

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);
        }
    }

}

and the xml file for it: 和它的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>

You can see that if you extend RecyclerView.Adapter, you will have to override these 3 methods. 您可以看到,如果扩展RecyclerView.Adapter,则必须覆盖这3种方法。

Hope this will help you to understand more the RecyclerView. 希望这将有助于您了解更多RecyclerView。

1 :- Main Layout 1: - 主要布局

    <android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:scrollbars="vertical" />

2:- items layout 2: - 项目布局

<TextView
    android:id="@+id/title"
    android:textColor="#000000"
    android:textSize="16dp"
    android:textStyle="bold"
    android:layout_alignParentTop="true"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/genre"
    android:layout_below="@id/title"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

<TextView
    android:id="@+id/year"
    android:textColor="#000FFF"
    android:layout_width="wrap_content"
    android:layout_alignParentRight="true"
    android:layout_height="wrap_content" />

3:- MainActivity 3: - MainActivity

 private List<Movie> movieList = new ArrayList<>();
 private RecyclerView recyclerView;
 private MoviesAdapter mAdapter;

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



    recyclerView = (RecyclerView) findViewById(R.id.recycler_view);

    mAdapter = new MoviesAdapter(movieList);
    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(getApplicationContext());
    recyclerView.setLayoutManager(mLayoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(mAdapter);

    prepareMovieData();
}

private void prepareMovieData() {
    Movie movie = new Movie("Mad Max: Fury Road", "Action & Adventure", "2015");
    movieList.add(movie);

    movie = new Movie("Inside Out", "Animation, Kids & Family", "2015");
    movieList.add(movie);

    movie = new Movie("Star Wars: Episode VII - The Force Awakens", "Action", "2015");
    movieList.add(movie);

    movie = new Movie("Shaun the Sheep", "Animation", "2015");
    movieList.add(movie);

    movie = new Movie("The Martian", "Science Fiction & Fantasy", "2015");
    movieList.add(movie);

    movie = new Movie("Mission: Impossible Rogue Nation", "Action", "2015");
    movieList.add(movie);

    movie = new Movie("Up", "Animation", "2009");
    movieList.add(movie);

    movie = new Movie("Star Trek", "Science Fiction", "2009");
    movieList.add(movie);

    movie = new Movie("The LEGO Movie", "Animation", "2014");
    movieList.add(movie);

    movie = new Movie("Iron Man", "Action & Adventure", "2008");
    movieList.add(movie);

    movie = new Movie("Aliens", "Science Fiction", "1986");
    movieList.add(movie);

    movie = new Movie("Chicken Run", "Animation", "2000");
    movieList.add(movie);

    movie = new Movie("Back to the Future", "Science Fiction", "1985");
    movieList.add(movie);

    movie = new Movie("Raiders of the Lost Ark", "Action & Adventure", "1981");
    movieList.add(movie);

    movie = new Movie("Goldfinger", "Action & Adventure", "1965");
    movieList.add(movie);

    movie = new Movie("Guardians of the Galaxy", "Science Fiction & Fantasy", "2014");
    movieList.add(movie);

    mAdapter.notifyDataSetChanged();
}

} }

ModelClass items ModelClass项目

public class Movie {
private String title, genre, year;

public Movie() {
}

public Movie(String title, String genre, String year) {
    this.title = title;
    this.genre = genre;
    this.year = year;
}

public String getTitle() {
    return title;
}

public void setTitle(String name) {
    this.title = name;
}

public String getYear() {
    return year;
}

public void setYear(String year) {
    this.year = year;
}

public String getGenre() {
    return genre;
}

public void setGenre(String genre) {
    this.genre = genre;
}

} }

3 Adapter class 3适配器类

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

private List<Movie> moviesList;

public class MyViewHolder extends RecyclerView.ViewHolder {
    public TextView title, year, genre;

    public MyViewHolder(View view) {
        super(view);
        title = (TextView) view.findViewById(R.id.title);
        genre = (TextView) view.findViewById(R.id.genre);
        year = (TextView) view.findViewById(R.id.year);
    }
}


public MoviesAdapter(List<Movie> moviesList) {
    this.moviesList = moviesList;
}

@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext())
            .inflate(R.layout.movie_list_row, parent, false);

    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    Movie movie = moviesList.get(position);
    holder.title.setText(movie.getTitle());
    holder.genre.setText(movie.getGenre());
    holder.year.setText(movie.getYear());
}

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

} }

The final modifier means that you can't assign another object to that pointer or reference, but you can still change the original object's internal values, like any public attributes or any other, provided the getters and setters. final修饰符意味着您不能将另一个对象分配给该指针或引用,但您仍然可以更改原始对象的内部值,如任何公共属性或任何其他属性,只要提供getter和setter。 And, editing here, I tried to recreate the code you gave us on android studio, and it's telling me that "Method does not override method from it's superclass". 在这里编辑,我试图重新创建你在android studio上给我们的代码,它告诉我“方法不会覆盖它的超类方法”。 Besides that, i'm getting an error because the superclass doesn't have a default constructor. 除此之外,我收到一个错误,因为超类没有默认构造函数。 So, I don't think the textbook is right. 所以,我不认为教科书是对的。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Kotlin:类型不匹配(RecyclerView.Adapter<RecyclerView.ViewHolder> ) - Kotlin: Type mismatch (RecyclerView.Adapter<RecyclerView.ViewHolder>) 从 RecyclerView.ViewHolder 更新 RecyclerView.Adapter 的 ArrayList? - Update ArrayList for RecyclerView.Adapter from RecyclerView.ViewHolder? 类型不匹配,必需:(Recyclerview.Adapter<recyclerview.viewholder> ?..Recyclerview.Adapter&lt;*&gt;,找到:HomeAdapter</recyclerview.viewholder> - Type Mismatch , Required: (Recyclerview.Adapter<Recyclerview.ViewHolder>?..Recyclerview.Adapter<*> , found: HomeAdapter "如何为 RecyclerView 适配器创建一个包装器,该包装器将接受任何实现 RecyclerView.Adapter 的适配器<RecyclerView.ViewHolder>" - How can I create a wrapper for the RecyclerView Adapter that will accept any Adapter that implements RecyclerView.Adapter<RecyclerView.ViewHolder> 从ViewHolder获取RecyclerView.Adapter列表 - Getting RecyclerView.Adapter List from ViewHolder RecyclerView.Adapter中的ViewHolder并非特定于位置 - ViewHolder in RecyclerView.Adapter not specific to position RecyclerView.Adapter中的函数viewholder类 - function viewholder class in RecyclerView.Adapter RecyclerView.ViewHolder中的onClickListener - onClickListener in RecyclerView.ViewHolder 了解RecyclerView.ViewHolder - Understanding RecyclerView.ViewHolder 从ViewHolder或ViewHolder的ViewModel访问RecyclerView.Adapter的方法 - access RecyclerView.Adapter's method from ViewHolder or ViewModel of ViewHolder
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM