2015-11-21 50 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

相關問題