gpt4 book ai didi

android - RecyclerView 适配器显示的图像多于应有的图像

转载 作者:行者123 更新时间:2023-11-29 00:05:51 26 4
gpt4 key购买 nike

我有一个 RecyclerView 适配器,它可以将另一个布局 (child_layout.xml) 膨胀到主布局 (main_layout.xml) 中。

这是 RecyclerView 适配器:

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

private static Context context;
private List<Message> mDataset;

public RecyclerAdapter(Context context, List<Message> myDataset) {
this.context = context;
this.mDataset = myDataset;
}

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnCreateContextMenuListener, View.OnClickListener {
public TextView title;
public LinearLayout placeholder;

public ViewHolder(View view) {
super(view);
view.setOnCreateContextMenuListener(this);

title = (TextView) view.findViewById(R.id.title);
placeholder = (LinearLayout) view.findViewById(R.id.placeholder);
}
}

@Override
public RecyclerAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.main_layout, parent, false);
ViewHolder vh = new ViewHolder((LinearLayout) view);

return vh;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Message item = mDataset.get(position);

holder.title.setText(item.getTitle());

int numImages = item.getImages().size();

if (numImages > 0) {
View inflater = LayoutInflater.from(holder.placeholder.getContext()).inflate(R.layout.child_layout, holder.placeholder, false);
ImageView image = (ImageView) inflater.findViewById(R.id.image);
Glide.with(context)
.load("http://www.website.com/test.png")
.fitCenter()
.into(image);
holder.placeholder.addView(inflater);
}
}

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

}

这是main_layout.xml:

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

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

<LinearLayout
android:id="@+id/placeholder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
/>

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

</LinearLayout>

这是child_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">

<ImageView
android:id="@+id/image"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>

</LinearLayout>

问题是,当我滚动浏览我的应用程序时,一些 View 显示了 2+ 张图像(当 child_layout 只有一个 ImageView 时):

http://i.imgur.com/AiYYs9l.png

为什么会这样?为什么有些 View 本应只显示一张图片却显示多张图片?

最佳答案

onBindViewHolder 用于将数据绑定(bind)到您在 onCreateViewHolder 中创建的 View (因此得名)。您不应该每次都在 onBindViewHolder 中填充一个新 View ,因为这会带走 RecyclerView 的巨大好处,即 View 回收。当前导致此问题的原因是,每次调用 onBindViewHolder 时,您都会膨胀并向主视图添加一个 subview 。可以为单个 View 多次调用此方法,这意味着每次调用时都会添加新的 subview 。您可以通过在 onCreateViewHolder 中仅膨胀一次 subview 来解决此问题。您对绑定(bind)的条件检查表明您不希望它始终可见。如果没有图像,您可以在 subview 上调用 setVisibility 来隐藏它。

关于android - RecyclerView 适配器显示的图像多于应有的图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33848669/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com