2016-07-29 4 views
1

У меня есть customrecycleAdapter, и когда я нажимаю на элемент, я бы изменил цвет строки, но если я прокручу позицию изменения фонового изображения или появится на другом элементе. Я читал о Рецептуре просмотра, но так, что это значит для этой проблемы?Повторить фон на элементе с прокруткой RecycleAdapter и прокруткой

мой адаптер:

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); 
     } 
    } 




} 

Так я нажимаю на элемент, и corretly setBackground, но если я перечисляю, я вижу еще один элемент с фоном выставиться, и если я перечисляю мой элемент, который я выбрал, убежище Фон.

+0

Это преимущество разделения модели и представления. Когда вы нажимаете кнопку, контроллер должен обновлять модель (т. Е. Индекс в массиве), то обновленная модель должна инициировать обновление уровня представления (т.е. адаптера), который затем может использовать модель (значение цвета) для отображения правильного цвета фона , – FishStix

ответ

0

RecyclerView повторное использование представления, чтобы нарисовать следующие элементы вашего списка, которые будут показаны, поэтому viewet с новыми данными, но продолжит иметь старые стили, из-за чего вы увидите другой элемент вашего списка с новым цветом.

Вы должны создать массив, хранящий, если этот элемент проверяется или нет, и их проверить, если было проверено, когда onBindViewHolder() называется

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

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

    } 

} 
Смежные вопросы