android - RecyclerView 概念如何在 Android 上运行?

标签 android android-recyclerview adapter android-cardview

我使用 RecyclerView 和 CardView 创建了一个基本的应用程序,从网站上获取教程。

应用程序运行良好,但我有些困惑。(我在这里展示了我的全部代码)

困惑在于代码是如何一步步运行的。所以请澄清我的概念。

我的应用程序的基本结构:

  1. 我已经创建了一个 row_data_layout xml 文件以绑定(bind)到 recycler_view
  2. 创建了一个数据类文件(我在这里定义了我在 App 中使用的变量)。
  3. 创建了一个 Adapter 文件(这里我想逐步弄清楚它是如何工作的,首先调用哪个类以及为什么?)。
  4. 将数据绑定(bind)到 MainActivity 文件上的 RecyclerView

row_data_layout.xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/CardView"
    android:paddingBottom="16dp"
    android:layout_marginBottom="16dp">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <TextView
            android:id="@+id/txt_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center_horizontal"
            android:text="Large Text"
            android:textAppearance="?android:attr/textAppearanceLarge" />
    </LinearLayout>

</android.support.v7.widget.CardView>

数据类文件:

public class Data {
    public String Name;

    Data(String Name)
    {
        this.Name=Name;
    }
}

Data_Adapter 类文件:

public class Data_Adapter extends RecyclerView.Adapter<Data_Adapter.View_holder> {
    List<Data> list = Collections.emptyList();
    Context context;

    public Data_Adapter(List<Data> list, Context context) {
        this.list = list;
        this.context = context;
    }

    @Override
    public Data_Adapter.View_holder onCreateViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_data_layout,parent,false);
        View_holder holder=new View_holder(v);
        return holder;
    }

    @Override
    public void onBindViewHolder(Data_Adapter.View_holder holder, int position) {
            holder.name.setText(list.get(position).Name);
    }

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

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    public class View_holder extends RecyclerView.ViewHolder{
        CardView cv;
        TextView name;

        public View_holder(View itemView) {
            super(itemView);
            cv = (CardView) itemView.findViewById(R.id.CardView);
            name = (TextView) itemView.findViewById(R.id.txt_name);
        }
    }
}

主要 Activity 文件:

public class MainActivity extends AppCompatActivity {

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

        List<Data> data = fill_data();
        RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerView);
        Data_Adapter adapter = new Data_Adapter(data,getApplicationContext());
        recyclerView.setAdapter(adapter);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
    }

    public List<Data> fill_data()
    {
        List<Data> data = new ArrayList<>();
        data.add(new Data("Bred Pit"));
        data.add(new Data("Leonardo"));

        return data;
    }
}

最佳答案

一旦您对 RecyclerView.Adapter 的工作原理有了基本的了解,就可以更深入地了解 documentation .

适配器所做的是保留一个扩展 View 池(这可以是 different 类型的 ViewHolder,只要您愿意),它会填充您提供的数据。当适配器在池中没有空 View 时,它会创建一个新 View 。

当一个 View 附加到 RecyclerView 时,它会从池中移除,当它被分离时(滚动超出 View ,到一定距离),它会被添加回空 View 池——这就是它的原因填充 ViewHolder 时重置所有内容很重要。

onCreateViewHolder()函数是创建一个新的空 View (由 RecyclerView.ViewHolder 包装)并将其添加到池中的地方。

onBindViewHolder()函数从空池中获取一个 View ,并使用您提供给适配器的数据填充该 View 。\

您可以使用 onViewRecycled()执行特定操作的方法,例如将 ImageView 的位图设置为 null(分离时)以减少内存使用。

我通常不会覆盖 onAttachedToRecyclerView() ,但是如果您需要在适配器与 RecyclerView 相关联时执行某些特定操作,则可以在此处执行。

关于android - RecyclerView 概念如何在 Android 上运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36042926/

相关文章:

java - 如何将数据传递到字符串中,该字符串将在另一个类中访问?

android - 将可隐藏的标题 View 添加到 recyclerview

android - 根据自定义适配器中的条件更改特定行的背景

java - 调试 AsyncTask - 奇怪的行为,调试跳转到代码中

Android:来自膨胀布局的自定义 View

java - 发布应用程序后通过新数据集更新 RecyclerView

java - ListView 第一项的值错误

android - 如何在回收站 View 行中添加动态 View

java - 存储和比较数据库中的对象

java - ArrayList<Object> 中的不兼容类型错误