2017-03-16 34 views
1

我有一個RecyclerView併成功地修改了一些數據。我有個問題。在onBindViewHolder方法中,我嘗試在線性佈局中添加自定義視圖。自定義視圖已成功添加,但向上或向下滾動視圖是重複的。我只想添加一件物品。如何在RecyclerView.Adapter中添加自定義視圖

我的代碼:

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

    public ArrayList<Train> trains; 
    public Context context; 
    private LayoutInflater inflater; 
    public OnItemClickListener mOnItemClickListener; 

    public void setmOnItemClickListener(OnItemClickListener mOnItemClickListener) { 
     this.mOnItemClickListener = mOnItemClickListener; 
    } 


    public class GenericViewHolder extends RecyclerView.ViewHolder { 
     public TextView stationName; 
     public LinearLayout vagoncontainer; 

     public GenericViewHolder(View view) { 
      super(view); 
      stationName = (TextView) view.findViewById(R.id.station_item_name); 
      vagoncontainer = (LinearLayout) view.findViewById(R.id.vagon_container); 


     } 
    } 

    public TrainsAdapter(Context context, ArrayList<Train> trains) { 
     this.context = context; 
     this.trains = trains; 
     inflater = LayoutInflater.from(context); 


    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = inflater.inflate(R.layout.trains_adapter_item, parent, false); 
     GenericViewHolder holder = new GenericViewHolder(view); 
     return holder; 


    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
     if (holder instanceof GenericViewHolder) { 
      GenericViewHolder genericViewHolder = (GenericViewHolder) holder; 
      Train train = trains.get(position); 
      ArrayList<Vagons> vagons = train.getVagons(); 
      for (int i = 0; i < vagons.size(); i++) { 
       LayoutInflater layoutInflater = LayoutInflater.from(context); 
       LinearLayout vagonView = (LinearLayout) layoutInflater.inflate(R.layout.trains_vagon_child, null); 
       Button button = (Button) vagonView.findViewById(R.id.button); 
       if (vagons.get(i).getEnable().equals("1")) 
        button.setVisibility(View.VISIBLE); 
       else 
        button.setVisibility(View.GONE); 
       button.setText(vagons.get(i).getName() + " " + vagons.get(i).getAmount()); 
       genericViewHolder.vagoncontainer.addView(vagonView); 
      } 


      genericViewHolder.stationName.setText(train.getDeparture()); 

     } 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

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

    public Train getItem(int position) { 
     return trains.get(position); 
    } 

    public interface OnItemClickListener { 
     void onItemClick(View view, int position); 
    } 
} 

我怎樣才能解決我的問題?

+0

你爲什麼要使用內循環onBindViewHolder?嘗試刪除。 – tahsinRupam

+0

,因爲在我的主要數據中包含一些Vagon的數據,並且我想按位置添加它們@ tahsinRupam – BekaKK

+0

您是否想使用Train類作爲父級和Vagon類作爲子級來擴展RecyclerView? – jemsnaban

回答

0

這將解決您的問題,但它不是有效的(它將不會順利滾動有大量的迷路的列車 - 膨脹視圖是昂貴的),因爲您將刪除並重新創建視圖LinearLayout代表行在ListView。重新考慮您的行佈局或在行視圖中創建一些僞回收。

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    if (holder instanceof GenericViewHolder) { 
     GenericViewHolder genericViewHolder = (GenericViewHolder) holder; 
     genericViewHolder.vagoncontainer.removeAllViews(); 
     Train train = trains.get(position); 
     ArrayList<Vagons> vagons = train.getVagons(); 
     for (int i = 0; i < vagons.size(); i++) { 
      LayoutInflater layoutInflater = LayoutInflater.from(context); 
      LinearLayout vagonView = (LinearLayout) layoutInflater.inflate(R.layout.trains_vagon_child, null); 
      Button button = (Button) vagonView.findViewById(R.id.button); 
      if (vagons.get(i).getEnable().equals("1")) 
       button.setVisibility(View.VISIBLE); 
      else 
       button.setVisibility(View.GONE); 
      button.setText(vagons.get(i).getName() + " " + vagons.get(i).getAmount()); 
      genericViewHolder.vagoncontainer.addView(vagonView); 
     } 

     genericViewHolder.stationName.setText(train.getDeparture()); 
    } 
} 
0

您可以使用core adapter

這是一個簡單的lib,以支持項目的任何類型的recyclerview無痛苦。

0

基本上RecyclerView重用您的viewHolder。因此,作爲每RecyclerView DOC here你必須每次重新設置的意見onBindViewHolder()方法中,

在此基礎上

但在向上或向下滾動視圖dublicated.I要添加僅一次與項目

你需要removeAllViews裏面你vagonContainer的ViewGroup

所以你綁定持有人會像

if (holder instanceof GenericViewHolder) { 
     GenericViewHolder genericViewHolder = (GenericViewHolder) holder; 
     Train train = trains.get(position); 
     ArrayList<Vagons> vagons = train.getVagons(); 

     // this is very important. removing all view 
     genericViewHolder.vagoncontainer.removeAllViews(); 
...... 

類似問題here

相關問題