2016-07-29 5 views
1

Ich habe customrecycleAdapter und wenn ich auf Element klicken, würde ich Farbe der Zeile ändern, aber wenn ich scroll Ansicht Hintergrund Position ändern oder auf anderen Element angezeigt. Ich habe über Recycle der Ansicht gelesen, aber so, Was ist Workoround für dieses Problem?Wiederholen Sie Hintergrund auf Element mit Scroll RecycleAdapter und scrollen

mein Adapter ist:

public class CustomRecycleAdapter extends RecyclerView.Adapter<CustomRecycleAdapter.ViewHolder> { 
    private JSONArray dataSource; 
    private AdapterCallback mAdapterCallback; 
    public static SparseBooleanArray selectedItems; 

    public CustomRecycleAdapter(JSONArray dataArgs, Context context){ 
     dataSource = dataArgs; 
     this.mAdapterCallback = ((AdapterCallback) context); 


    } 



    public static interface AdapterCallback { 
     void onMethodCallback(View caller, JSONObject obj, JSONArray data, int position); 
    } 


    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // create a new view 
     View view = LayoutInflater.from(parent.getContext()) 
       .inflate(R.layout.list_view_activities, parent, false); 

     ViewHolder viewHolder = new ViewHolder(view, new CustomRecycleAdapter.ViewHolder.IMyViewHolderClicks() { 
      public void onClick(View caller, int position) { 
       try { 

        JSONObject itemClicked = dataSource.getJSONObject(position); 
        mAdapterCallback.onMethodCallback(caller, itemClicked, dataSource, position); 
//     Log.e("clicked", itemClicked.toString()); 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      }; 
     }); 

     return viewHolder; 

    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     try { 

      JSONObject object = dataSource.getJSONObject(position); 
      holder.textView.setText(object.getString("description")); 





     } catch (JSONException e) { 
      e.printStackTrace(); 
     } 

    } 
    @Override 
    public int getItemCount() { 
     return dataSource.length(); 
    } 

    public JSONObject getItem(int position) throws JSONException { 
     return dataSource.getJSONObject(position); 
    } 

    public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 

     public IMyViewHolderClicks mListener; 
     public TextView textView; 
     public TextView hours; 

     public ViewHolder(View itemView, IMyViewHolderClicks listener) { 
      super(itemView); 
      mListener = listener; 
      textView = (TextView) itemView.findViewById(R.id.activity); 
      hours = (TextView) itemView.findViewById(R.id.hours); 
      itemView.setOnClickListener(this); 

     } 


     @Override 
     public void onClick(View v) { 
      int position = getAdapterPosition(); 
      Log.e("RecycleAdapterPosition", String.valueOf(getAdapterPosition())); 
//   mListener.onClick(v, position); 
      v.setBackgroundColor(Color.GREEN); 
      v.setSelected(true); 


     } 
     public interface IMyViewHolderClicks { 


      public void onClick(View caller, int position); 
     } 
    } 




} 

ich auf Element So klicken und corretly setBackground, aber wenn ich scrollen, ich sehe ein anderes Element mit Hintergrund gefassten und wenn ich scrollen mein Element nach oben, dass ich ausgewählt, haven nicht Hintergrund.

+0

Dies ist ein Vorteil der Trennung von Modell und Ansicht aufgerufen wird. Wenn Sie auf klicken, sollte ein Controller das Modell (dh den Index in einem Array) aktualisieren, dann sollte das aktualisierte Modell eine Aktualisierung der Ansichtsebene (dh des Adapters) auslösen, die dann das Modell (den Farbwert) zum Rendern der richtigen Hintergrundfarbe verwenden kann . – FishStix

Antwort

0

RecyclerView wiederverwenden die Ansicht, um die nächsten Elemente Ihrer Liste zu zeichnen, die angezeigt werden, so dass das Viewset mit neuen Daten aber weiterhin die alten Stile hat, weil Sie andere Elemente Ihrer Liste mit der neuen Farbe sehen.

Sie sollten ein Array Speicherung erstellen, wenn dieses Element aktiviert ist oder nicht, und sie prüfen, ob geprüft wurde, als onBindViewHolder()

@Override 
public void onBindViewHolder(final YourViewHolder holder, final int position) { 

    if(checked[position]){ 
     //YourViewHolder change colour 

    } 

}