我使用 RecyclerView 和 CardView 创建了一个基本的应用程序,从网站上获取教程。
应用程序运行良好,但我有些困惑。(我在这里展示了我的全部代码)
困惑在于代码是如何一步步运行的。所以请澄清我的概念。
我的应用程序的基本结构:
- 我已经创建了一个
row_data_layout
xml 文件以绑定(bind)到recycler_view
。 - 创建了一个数据类文件(我在这里定义了我在 App 中使用的变量)。
- 创建了一个 Adapter 文件(这里我想逐步弄清楚它是如何工作的,首先调用哪个类以及为什么?)。
- 将数据绑定(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/