Медленный выбор item в RecyclerView

500
06 февраля 2017, 15:42

Есть RecyclerView в виде сетки из квадратов. Нужно реализовать режим выбора квадрата, то есть при выборе другого квадрата, подсветка у прежнего должна пропадать и подсвечиваться новый квадрат. Подсветка у меня это черный сплошный квадрат поверх квадрата с черной гранью, вот разметка айтема (корневой тэг это квадратный FrameLayout)

    <package.CellSquare xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" 
android:background="@drawable/square_background">
      <View android:id="@+id/cell_choice"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:background="#000000" /> 
      </package.CellSquare>

Реализация режима выбора (адаптер)

public class GameAdapter extends RecyclerView.Adapter<GameAdapter.AdapterHolder>
{
    int choice_position = -1;
    public class AdapterHolder extends RecyclerView.ViewHolder implements OnClickListener
    {
        @Override
        public void onClick(View v)
        {
            choice_position = getAdapterPosition();
            notifyDataSetChanged();
        }
        View choice;
        AdapterHolder(View itemView)
        {
            super(itemView);
            choice = itemView.findViewById(R.id.cell_choice);
            itemView.setOnClickListener(this);
        }
    }
    public GameAdapter()
    {
    }
    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView)
    {
        super.onAttachedToRecyclerView(recyclerView);
    }
    @Override
    public AdapterHolder onCreateViewHolder(ViewGroup viewGroup, int p2)
    {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.square_item, viewGroup, false);
        AdapterHolder pvh = new AdapterHolder(v);
        return pvh;
    }
    @Override
    public void onBindViewHolder(final AdapterHolder holder, final int position)
    {
        if(choice_position == position){
            holder.choice.setVisibility(View.VISIBLE);
        }
        else{
            holder.choice.setVisibility(View.INVISIBLE);
        }
    }
    @Override
    public int getItemCount()
    {
        return 100;
    }
}

Все работает. Но медленно сменяется выбор. Почему?

Answer 1

Решил проблему - notifyDataSetChanged долго обрабатывает все 100 квадратов, лучше обрабатывать те, которые надо

notifyItemChanged(choice_position);
choice_position = getAdapterPosition();
notifyItemChanged(choice_position);

Так получается быстро.

READ ALSO
Изменить код адаптера ListView на RecyclerView

Изменить код адаптера ListView на RecyclerView

Добрый деньНаписал приложение в котором есть ListView и написал для нее адаптер

552
Отображение изображения в html теге

Отображение изображения в html теге

Допустим есть некий код :

445
Не отображается Full image

Не отображается Full image

Делаю приложение с обоями, НО возникла проблема с отображением картинки, картинка появляется только после того как я нажимаю на кнопку "Установить...

476