2016-03-25 30 views
0

我有一個從ArrayList填充的RecyclerView。輸出是CardView佈局。 在卡片視圖中,其他視圖中有2個按鈕。 他們只需要讀取默認值爲1的TextView的當前值,然後增加或減少它。 Arraylist包含8個項目。ReclyclerView和CardView,onclick方法同時在多個CardView上執行動作

當我運行應用程序的UI工作正常。麻煩的是當我嘗試修改TextView的值時。 在我正在處理的CardView上,該值正確增加和減少,但同時該值在另一個CardView上被修改。在第二個CardView中,修改其TextView值也會修改第一個。

那麼,我做錯了什麼?

這是我的片段:

public class Fragment_rosas extends Fragment { 


@Override 
public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { 

    View view = inflater.inflate(R.layout.layout_rosas,container,false); 

    RecyclerView recyclerview_rosas; 
    RecyclerView.Adapter adaptador_rv_rosas; 
    RecyclerView.LayoutManager lm_rosas; 

    List rosas = new ArrayList(); 

    rosas.add(new Tropa(1,R.drawable.minibarbaro, getResources().getString(R.string.barbaro),7,1)); 

    recyclerview_rosas = (RecyclerView) view.findViewById(R.id.recyclerView_tropasRosas); 
    recyclerview_rosas.setHasFixedSize(true); 

    lm_rosas = new LinearLayoutManager(getContext()); 
    recyclerview_rosas.setLayoutManager(lm_rosas); 

    adaptador_rv_rosas = new AdaptadorTropa(rosas); 
    recyclerview_rosas.setAdapter(adaptador_rv_rosas); 

    return view; 
} 

}

這裏的代碼在我的適配器部分:

@Override 
public void onBindViewHolder(final TropaViewHolder viewHolder, int i) { 


    viewHolder.imagen.setImageResource(items.get(i).getImagen()); 
    viewHolder.nombre.setText(items.get(i).getNombre()); 
    viewHolder.maxnivel.setText(String.valueOf(items.get(i).getNivelMax())); 
    viewHolder.espacioencamp.setText((String.valueOf(items.get(i).getEspacioEnCamp()))); 


    final String nombre = items.get(i).getNombre(); 
    final int maxnivel = items.get(i).getNivelMax(); 


    viewHolder.nivelmas.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 

      String niveltemp = viewHolder.nivel.getText().toString(); 
      String nivelmaxtemp = viewHolder.maxnivel.getText().toString(); 

      int nivel = Integer.parseInt(niveltemp); 
      int maxxnivel = Integer.parseInt(nivelmaxtemp); 
      int nuevonivel = nivel+1 ; 

      if (nuevonivel<=maxxnivel) { 
       viewHolder.txtv_nivel.setText(String.valueOf(nuevonivel)); 
      } 
     } 
    }); 

我OnCreateViewHolder(沒有什麼在這裏發生):

@Override 
public TropaViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { 
    View v = LayoutInflater.from(viewGroup.getContext()) 
      .inflate(R.layout.cardview, viewGroup, false); 

    return new TropaViewHolder(v); 
} 
+0

有2個問題該溶液中。首先,您需要記住每個TextView增加/減少的值,否則,當視圖被回收時,您將始終看到TextView的默認值。其次,您可能需要在onCreateViewHolder中設置點擊偵聽器,以使其更加高效。看到你的onCreateViewHolder會非常有幫助。 – dkarmazi

+0

用我的onCreateViewHolder更新,你可以看到我只是在那裏膨脹佈局。我應該在這裏寫聽衆嗎? –

回答

0

這裏是溶液,如上面的評論中提及,它解決了兩個問題: 1. positiontoValueMap - 每個位置 2. onclicklistener被傳遞到ViewHolder在onCreateViewHolder節省電流值

適配器類別

public class MyAdapter extends RecyclerView.Adapter { 
    private Context context; 
    private List<String> dataList; 
    private Map<Integer, Integer> positionToValueMap = new HashMap<>(); 

    public MyAdapter(Context context, List<String> dataList) { 
     this.context = context; 
     this.dataList = dataList; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(context).inflate(R.layout.recycler_view_item, null, false); 

     return new MyViewHolder(view, new OnRecyclerItemClickListener()); 
    } 


    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     ((MyViewHolder) holder).onRecyclerItemClickListener.updatePosition(position); 
     ((MyViewHolder) holder).position.setText("" + position); 
     ((MyViewHolder) holder).title.setText(dataList.get(position)); 

     int valueToDisplay = 1; 

     if(positionToValueMap.containsKey(position)) { 
      valueToDisplay = positionToValueMap.get(position); 
     } else { 
      positionToValueMap.put(position, valueToDisplay); 
     } 

     ((MyViewHolder) holder).valueView.setText("value: " + valueToDisplay); 
    } 

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

    private class MyViewHolder extends RecyclerView.ViewHolder { 
     private OnRecyclerItemClickListener onRecyclerItemClickListener; 
     private TextView position; 
     private TextView title; 
     private TextView valueView; 

     public MyViewHolder(View itemView, OnRecyclerItemClickListener onRecyclerItemClickListener) { 
      super(itemView); 

      itemView.setOnClickListener(onRecyclerItemClickListener); 
      this.onRecyclerItemClickListener = onRecyclerItemClickListener; 
      this.position = (TextView) itemView.findViewById(R.id.position); 
      this.title = (TextView) itemView.findViewById(R.id.title); 
      this.valueView = (TextView) itemView.findViewById(R.id.value_view); 
     } 
    } 


    private class OnRecyclerItemClickListener implements View.OnClickListener { 
     private int position = -1; 

     public void updatePosition(int position) { 
      this.position = position; 
     } 

     @Override 
     public void onClick(View v) { 
      int oldValue = positionToValueMap.get(position); // get current value 
      oldValue++; // increment 
      positionToValueMap.put(position, oldValue); // save current value 
      notifyItemChanged(position); // update clicked view so that it picks up the new saved value from the positionToValueMap in onBindViewHolder 
     } 
    } 
} 

RecyclerView項目佈局

<TextView 
     android:id="@+id/position" 
     android:layout_width="30dp" 
     android:layout_height="50dp" 
     android:textColor="@android:color/white" 
     android:gravity="center" 
     android:background="@android:color/holo_green_light" 
     android:layout_alignParentLeft="true"/> 

    <TextView 
     android:id="@+id/title" 
     android:layout_width="50dp" 
     android:layout_height="50dp" 
     android:textColor="@android:color/white" 
     android:gravity="center" 
     android:background="@android:color/holo_green_dark" 
     android:layout_toRightOf="@id/position" /> 

    <TextView 
     android:id="@+id/value_view" 
     android:layout_width="match_parent" 
     android:layout_height="50dp" 
     android:textColor="@android:color/white" 
     android:gravity="center" 
     android:background="@android:color/holo_green_light" 
     android:layout_toRightOf="@id/title" 
     android:layout_alignParentRight="true"/> 
</RelativeLayout> 

及活性測試它

public class MainActivity extends AppCompatActivity { 
    private RecyclerView recyclerView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 

     recyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext())); 
     recyclerView.setAdapter(new MyAdapter(getApplicationContext(), getSampleData())); 
    } 

    private static List<String> getSampleData() { 
     List<String> dataList = new ArrayList<>(); 
     dataList.add("zero"); 
     dataList.add("one"); 
     dataList.add("two"); 
     dataList.add("three"); 
     dataList.add("four"); 
     dataList.add("five"); 
     dataList.add("six"); 
     dataList.add("seven"); 
     dataList.add("eight"); 
     dataList.add("nine"); 
     dataList.add("ten"); 
     dataList.add("eleven"); 
     dataList.add("twelve"); 
     dataList.add("thirteen"); 
     dataList.add("fourteen"); 
     dataList.add("fifteen"); 
     dataList.add("sixteen"); 
     dataList.add("seventeen"); 
     dataList.add("eighteen"); 
     dataList.add("nineteen"); 
     dataList.add("twenty"); 

     return dataList; 
    } 
} 

活動佈局

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/root_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/recycler_view" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:background="@android:color/white"/> 

</RelativeLayout> 
+0

謝謝你的驚人答案。我試圖弄清楚如何在我的代碼中實現你的代碼。如果我想要處理特定按鈕上的點擊事件而不僅僅是整個RecyclerView項目? –

+0

@RaulLopez,不客氣。在這種情況下,你所要做的就是在私有類MyViewHolder中改變這一行itemView.find.setOnClickListener(onRecyclerItemClickListener)擴展RecyclerView.ViewHolder。而不是itemView,這可以是您在回收視圖項目中的任何視圖。 – dkarmazi

+0

謝謝你,隊友!我已經想出了一個解決方案,我在OnRecyclerItemClickListener類中實現了一個通用的onClick監聽器,並通過一個開關/案例獲取了單擊的視圖Id,現在我可以處理6個按鈕。 –