2017-01-09 2 views
0

У меня есть реализовать пользовательские RecyclerView сделать это: enter image description hereRecyclerView медленно в множественном выборе

и я использовал этот пользовательский XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:clickable="true" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="50dp"> 

    <ImageView 
     android:layout_width="40dp" 
     android:layout_height="40dp" 
     android:layout_centerVertical="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_marginLeft="8dp" 
     android:layout_marginStart="8dp" 
     android:id="@+id/color" 
     android:background="@drawable/appborder" /> 

    <TextView 
     android:text="TextView" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/item" 
     android:textColor="@color/colorPrimary" 
     android:layout_centerVertical="true" 
     android:layout_toRightOf="@+id/color" 
     android:layout_marginLeft="10dp" 
     android:layout_marginStart="10dp" /> 

    <ImageView 
     android:layout_width="30dp" 
     android:layout_height="30dp" 
     app:srcCompat="@drawable/check" 
     android:layout_centerVertical="true" 
     android:layout_alignParentRight="true" 
     android:visibility="invisible" 
     android:layout_alignParentEnd="true" 
     android:layout_marginRight="7dp" 
     android:layout_marginEnd="7dp" 
     android:id="@+id/check" /> 

</RelativeLayout> 

И это мой пользовательский адаптер:

public class RecyclerColorsDialogAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 
    private Context context; 
    private int [] colors; 
    private boolean [] checked; 
    private String [] text; 
    private boolean isChecked; 

    public RecyclerColorsDialogAdapter(Context context, int[] colors, boolean[] checked, String[] text) { 
     this.context = context; 
     this.colors = colors; 
     this.checked = checked; 
     this.text = text; 
    } 

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.custom_color_item, parent, false); 
     PaHolder mHolder = new PaHolder(view); 
     return mHolder; 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
     String singleColor = text[position]; 
     isChecked = checked[position]; 

     final PaHolder mHolder = (PaHolder)holder; 

     mHolder.text.setText(singleColor); 

     setCorners(colors[position],mHolder.color); 

     if(isChecked) 
     mHolder.check.setVisibility(View.VISIBLE); 
     else 
     mHolder.check.setVisibility(View.INVISIBLE); 

     mHolder.view.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       if (isChecked) { 
       checked[position] = false; 
       isChecked = false; 

       } else { 
       checked[position] = true; 
       isChecked = true; 
       } 

       mHolder.check.setVisibility(checked[position] ? View.VISIBLE : View.INVISIBLE); 
      } 
     }); 
     mHolder.text.setTypeface(Typeface.createFromAsset(context.getAssets(),"fonts/Avenir-Book.ttf")); 
    } 

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

    private class PaHolder extends RecyclerView.ViewHolder { 
     View view; 
     TextView text; 
     ImageView color, check; 

     public PaHolder(View itemView) { 
      super(itemView); 
      view = itemView; 
      text = (TextView)itemView.findViewById(R.id.item); 
      check = (ImageView)itemView.findViewById(R.id.check); 
      color = (ImageView)itemView.findViewById(R.id.color); 
     } 
    } 

    public void setCorners(int color,ImageView imageView) { 
     GradientDrawable gd = new GradientDrawable(); 

     // Specify the shape of drawable 
     gd.setShape(GradientDrawable.RECTANGLE); 

     // Set the fill color of drawable 
     gd.setColor(context.getResources().getColor(color));// make the background transparent 

     // Create a 2 pixels width red colored border for drawable 
     gd.setStroke(2, context.getResources().getColor(R.color.corners)); // border width and color 

     // Make the border rounded 
     gd.setCornerRadius(15.0f); // border corner radius 

     // Finally, apply the GradientDrawable as TextView background 
     imageView.setBackground(gd); 
    } 
} 

Проблема заключается в том, что когда я нажимаю, например, цвет (например, «красный») несколько раз при первом щелчке, он не выбирает/не выбирает item: при втором щелчке в том же представлении он работает.

Я также попытался поставить focusable = false, но проблема такая же.

У кого-нибудь может быть предложение на эту проблему?

Благодаря

+0

Ваш 'onBindViewHolder' использует переменную-член' isChecked', которая относится к классу, а не к методу. Вероятно, это ваша проблема. – Karakuri

+0

@ Каракури, в чем же проблема? – ste9206

+0

Конфигурируйте состояние в ViewHolder/item/etc. Проблема с тем, что у вас сейчас есть, заключается в том, что когда 'onBindViewHolder' вызывается для одного элемента, он влияет на состояние других элементов, потому что все они относятся к вашей переменной-члену класса. – Karakuri

ответ

4

Хорошо, просто избавиться от isChecked переменной у вас есть. Вместо этого используйте только checked[position].

И звоните notifyDataSetChanged в onClickListener вашего владельца вместо того, чтобы скрывать и показывать товар.

if(checked[position]) 
    mHolder.check.setVisibility(View.VISIBLE); 
else 
    mHolder.check.setVisibility(View.INVISIBLE); 

mHolder.view.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View view) { 
     if (checked[position]) { 
     checked[position] = false; 
     } else { 
     checked[position] = true; 
     } 

     // Just add notify. Remove the show/hide code. 
     notifyDataSetChanged(); 
    } 
});