Recyclerview item中的子view动态使用addview加载view,onBindViewHolder只走了一次为什么
时间: 2024-05-26 14:19:07 浏览: 147
RecyclerView的优化机制会复用已经创建的ViewHolder来显示新的数据项,而不是每次都创建新的ViewHolder。当新的数据项需要显示时,RecyclerView会调用onBindViewHolder方法,将新的数据绑定到已经创建的ViewHolder上。
因此,当你在RecyclerView的item中的子view动态使用addView加载view时,如果这些view在ViewHolder中已经被添加过,那么它们不会被重新创建,也不会被重新添加到ViewHolder中。这就意味着,如果你只在第一个item里添加了子view,那么当滑动时,这些子view会被复用,并且不会被重新添加到ViewHolder中。
如果你想在每个item中都添加子view,可以在ViewHolder的构造方法中进行添加。或者,你可以在onBindViewHolder方法中检查是否已经添加了子view,如果没有,则添加。这样就可以保证每次都会添加子view。
相关问题
Recyclerview item中的子view如何动态加载view
可以使用RecyclerView.Adapter中的onBindViewHolder方法来动态加载子View。在onBindViewHolder中,可以通过holder.itemView获取到RecyclerView中当前item的根View,然后再通过addView方法动态添加子View。
例如,我们可以定义一个ViewHolder类,其中包含需要动态加载的子view的id:
```
public class MyViewHolder extends RecyclerView.ViewHolder {
public LinearLayout mLinearLayout;
public MyViewHolder(View itemView) {
super(itemView);
mLinearLayout = itemView.findViewById(R.id.linear_layout);
}
}
```
然后在RecyclerView.Adapter的onBindViewHolder方法中,根据需要动态添加子View:
```
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
// 获取需要动态添加的子View数据
List<String> data = mDataList.get(position);
// 清空LinearLayout中的子View
holder.mLinearLayout.removeAllViews();
// 动态添加子View
for (String str : data) {
TextView textView = new TextView(mContext);
textView.setText(str);
holder.mLinearLayout.addView(textView);
}
}
```
这样,每次RecyclerView刷新时,都会根据需要动态加载子View。
androidview动态加载
要在 Android 中动态加载 View,可以使用 LayoutInflater 类。下面是一些基本的步骤:
1. 获取 LayoutInflater 实例
可以通过调用 getLayoutInflater() 方法来获取 LayoutInflater 实例,该方法可以在 Activity 中直接调用,也可以在 Fragment 中使用 getActivity().getLayoutInflater() 或者 LayoutInflater.from(context) 来获取。
2. 加载布局文件
可以通过调用 LayoutInflater 的 inflate() 方法来加载布局文件,该方法接受两个参数:要加载的布局文件的资源 ID 和要将该布局添加到的父 View。
3. 添加 View 到父 View
如果要将新加载的 View 添加到一个已有的容器中,可以使用 ViewGroup 的 addView() 方法。如果要在一个 Activity 中添加 View,可以使用 setContentView() 方法。
下面是一个示例代码:
```
LayoutInflater inflater = getLayoutInflater();
View view = inflater.inflate(R.layout.my_layout, parentView, false);
parentView.addView(view);
```
其中,my_layout 是要加载的布局文件的资源 ID,parentView 是要将该布局添加到的父 View。
阅读全文