2015-11-21 29 views
2

我有膨胀另一布局(child_layout.xml)到主布局(main_layout.xml)一个RecyclerView适配器。RecyclerView适配器示出多个图像比它应该是

这里是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> 

的问题是,我通过我的应用程序中滚动,一些意见显示2+图像(当child_layout只有一个ImageView):

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

为什么会出现这种情况?为什么有些视图只显示一个视图时会显示多个图像?

+0

为什么你使用两个单独的布局,不合并成一个?你试图达到什么目标? – Nevercom

+0

我打算稍后添加一个条件,根据图像的数量加载不同的子布局。据我所知,以这种方式夸大孩子的布局是我提出的唯一方法。 – user5590200

+1

如果您想根据某些条件为每行使用不同的布局,则应该使用'getItemViewType'方法,'onCreateViewHolder'的第二个参数返回getItemViewType方法的结果,以便您可以根据排位。 – Nevercom

回答

2

onBindViewHolder是用于将数据绑定到您在onCreateViewHolder(因此名称)中创建的视图。您不应每次在onBindViewHolder中夸大新视图,因为这会消除RecyclerView的巨大利益,即视图回收。目前导致此问题的原因是每次调用onBindViewHolder时,都会膨胀并将子项添加到主视图。对于单个视图可以多次调用此方法,这意味着每次调用时都要添加新的子视图。您可以通过在onCreateViewHolder内仅对子视图充气来解决此问题。您在绑定中的条件检查表明您不希望它始终可见。如果没有图像,您可以在子视图上调用setVisibility将其隐藏。

+0

如果我把'View child = LayoutInflater.from(holder.placeholder.getContext())。inflate(R.layout.child_layout,holder.placeholder,false);'放入'onCreateViewHolder',我该如何引用'placeholder' ? – user5590200

+0

您不需要'onCreateViewHolder'中的占位符。如果您需要对布局压缩器的上下文进行引用,请使用'parent.getContext()'。顺便说一句,我很好奇:为什么不把'child_layout'放在'main_layout'里面?据我所知,你只能使用一个'ImageView',使两个独立的布局有点多余。除非我错过了某些东西。 –

+0

你可以给我一个你如何修改我的代码的代码示例吗?我打算稍后添加一个条件,根据图像的数量加载不同的子布局。 – user5590200

相关问题