2016-09-21 66 views
1

在我的項目,我需要根據來自web服務的響應添加ImageView不同數量的每行,我能做到這一點,但我滾動從行重複的recyclerViewImageView本身。的Android - RecyclerView地重複編程添加imageviews

我的應用程序的想法是能夠創建和分享組合(輸入視頻遊戲的設置)。這是我的適配器代碼。

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    if (viewType == TYPE_COMBO) { 
     View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.row, parent,false); 
     ComboViewHolder comboViewHolder = new ComboViewHolder(row); 
     return comboViewHolder; 
    } else { 
     View row = LayoutInflater.from(parent.getContext()).inflate(R.layout.progress_footer, parent, false); 
     FooterViewHolder footerViewHolder = new FooterViewHolder(row); 
     return footerViewHolder; 
    } 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (holder instanceof ComboViewHolder) { 
     ComboViewHolder comboViewHolder = (ComboViewHolder) holder; 
     ComboImp comboImp = (ComboImp) data.get(position); 
     ComboConverter comboConverter = new ComboConverter(); 
     comboConverter.convertToPS4(comboImp.getCombo()); 
     LinearLayout LinearLayout = new LinearLayout(mContext); 
     LinearLayout.LayoutParams imageViewParams = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT); 
     int[] comboItems = comboConverter.convertToPS4(comboImp.getCombo()); 
     PairingFunction pairingFunction = new PairingFunction(); 
     for (int i = 0; i < comboItems.length; i++) { 
      int id = pairingFunction.pair(i + 1, position + 1); 
      comboViewHolder.imageView = new ImageView(mContext); 
      comboViewHolder.imageView.setId(id); 
      comboViewHolder.imageView.setImageResource(0); 
      comboViewHolder.imageView.setLayoutParams(imageViewParams); 
      comboViewHolder.imageView.setImageResource(comboConverter.getPs4Picture(Control.getByCode(comboItems[i]))); 
      linearLayout.addView(comboViewHolder.imageView); 
     } 
     comboViewHolder.linearLayout.addView(linearLayout); 
    } 
} 


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


public static class ComboViewHolder extends RecyclerView.ViewHolder{ 
    private TextView combo,postDate; 
    private View circleView; 
    private LinearLayout linearLayout; 
    private ImageView imageView; 
    public ComboViewHolder(View itemView) { 
     super(itemView); 

     linearLayout = (LinearLayout)itemView.findViewById(R.id.LinearRow); 
     linearLayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       imageView.setImageResource(R.drawable.ps4_square_30x30); 
      } 
     }); 
    } 
    public TextView getCombo() { 
     return combo; 
    } 
    public TextView getPostDate() { 
     return postDate; 
    } 

    public View getCircleView() { 
     return circleView; 
    } 

    public View getImageView() { 
     return imageView; 
    } 
    public LinearLayout getLinearLayout(){return linearLayout;} 
} 

至於XML文件是一個簡單的LinearLayout,它沒有任何內容。

我用的配對功能可爲創建的每個ImageView一個唯一的ID,它並不是完美的(有足夠的行和ImageView整數會最大程度的發揮),但現在

回答

0

你需要在你上方

comboViewHolder.linearLayout.removeAllViews(); 
+0

很高興它幫助@AlexanderJimenez。請提出答案。謝謝 –

+0

對不起,我嘗試了,但是我的聲望還不夠高(低於15),以至於我的投票反映了分數 –

0

編程添加視圖的工作和回收/網格/列表視圖是一個糟糕的組合。因爲你將它們添加到視圖中,但它們在回收時不會被刪除。爲了使它們工作,每次在調用BindViewHolder時都必須刪除所有以編程方式添加的視圖並讀取它們。這與觀察回收的想法相反,並且在時間上非常昂貴,所以它沒有提出。

唯一的另一個想法是將自己的回收邏輯寫入佈局,以便從單獨的回收池手動回收添加的視圖。這是可行的,但真正的痛苦在脖子上。

做一個好人 - 這是我的LinearLayout替代品,可以在回收再利用中實現。它仍然不是100%的效率(它需要在行之間共享,甚至更好,我會在某一天完成),但它至少可以將向循環佈局添加新行的性能降到最低。隨意調整其與RelativeLayout的工作像它看起來你需要:

public class RecycledLinearLayout extends LinearLayout { 

    public interface RecyledLinearLayoutAdapter<ItemType, HolderType> { 
     View createView(ViewGroup parent); 
     HolderType createHolder(View view); 
     void assignToView(View view, HolderType holder, ItemType item); 
    } 

    private List<View> mRecycledTaskViews; 
    private List<Object> mRecycledTaskHolders; 
    private RecyledLinearLayoutAdapter mAdapter; 

    public RecycledLinearLayout(Context context) { 
     super(context); 
     init(context, null, 0); 
    } 

    public RecycledLinearLayout(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     init(context, attrs, 0); 
    } 

    public RecycledLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
     init(context, attrs, defStyleAttr); 
    } 

    public void init(Context context, AttributeSet attrs, int defStyleAttr) { 
     mRecycledTaskViews = new ArrayList<>(); 
     mRecycledTaskHolders = new ArrayList<>(); 
    } 

    public void setAdapter(RecyledLinearLayoutAdapter adapter) { 
     mAdapter = adapter; 
    } 

    public void setItems(List items) { 
     removeAllViews(); 
     if(mAdapter == null || items == null) { 
      return; 
     } 
     for(int i = mRecycledTaskViews.size(); i < items.size(); i++) { 
      View view = mAdapter.createView(this); 
      mRecycledTaskViews.add(view); 
      mRecycledTaskHolders.add(mAdapter.createHolder(view)); 
     } 
     for(int i=0; i < items.size(); i++) { 
      Object item = items.get(i); 
      View currentView = mRecycledTaskViews.get(i); 
      Object currentHolder = mRecycledTaskHolders.get(i); 
      mAdapter.assignToView(currentView, currentHolder, item); 
      addView(currentView); 
     } 
    } 

} 
0

試試這個添加這樣一行onBindViewHolder()方法。 ..

for (int i = 0; i < comboItems.length; i++) { 
       int id = pairingFunction.pair(i + 1, position + 1); 
       ImageView imageView = new ImageView(mContext); 
       imageView.setId(id); 
       imageView.setImageResource(0); 
       imageView.setLayoutParams(imageViewParams); 
       imageView.setImageResource(comboConverter.getPs4Picture(Control.getByCode(comboItems[i]))); 
       relativeLayout.addView(imageView); 
    }