Выбранные элементы не выбираются после прокрутки в Recyclerview - PullRequest
1 голос
/ 06 ноября 2019

Я сделал адаптер, чтобы показать количество городов, где мы должны их выбрать. Однако, когда я прокручиваю вниз и снова возвращаюсь вверх, выбранные элементы снова отменяются.

Я попытался установить для sethasStableIds значение true, но это тоже не сработало

public class CitiesAdapter extends RecyclerView.Adapter<CitiesAdapter.ViewHolder> {

private static final String TAG = "CitiesViewAdapter";

private List<Cities> citiesModelList;
private Context mContext;
private OnClickListner mOnNoteListner;

public CitiesAdapter(List<Cities> citiesModelList, Context mContext , OnClickListner mOnNoteListner) {
    this.citiesModelList = citiesModelList;
    this.mContext = mContext;
    this.mOnNoteListner = mOnNoteListner;
    setHasStableIds(true);
}

@NonNull
@Override
public CitiesAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.cities_listitems, viewGroup , false);
    CitiesAdapter.ViewHolder holder = new CitiesAdapter.ViewHolder(view , mOnNoteListner , this);
    return holder;
}

@Override
public void onBindViewHolder(@NonNull CitiesAdapter.ViewHolder viewHolder, int i) {
    Log.d(TAG , "onBindViewHolder: called.");

    Cities citiesmodels = citiesModelList.get(i);
    viewHolder.tvCitiesName.setText(citiesmodels.getName());
}

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

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemViewType(int position)
{
    return position;
}

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

    TextView tvCitiesName;


    OnClickListner onClickListner;
    private CitiesAdapter citiesAdapter;

    public ViewHolder(@NonNull View itemView , OnClickListner onClickListner , CitiesAdapter citiesAdapter) {
        super(itemView);
        tvCitiesName = itemView.findViewById(R.id.tvCitiesName);
        this.onClickListner = onClickListner;
        itemView.setOnClickListener(this);
        this.citiesAdapter = citiesAdapter;
    }

    @Override
    public void onClick(View v) {
        onClickListner.onItemClick(getAdapterPosition(),citiesAdapter.getItem(getAdapterPosition()));
    }
}

public Cities getItem(int i){
    return citiesModelList.get(i);
}

public interface OnClickListner{
    void onItemClick(int position , Cities cities);
}

}

У меня вставлен адаптер ниже. Любая помощь будет принята с благодарностью. Спасибо в adavnce

Ответы [ 3 ]

1 голос
/ 06 ноября 2019

В объекте Cities определите логическое свойство с именем selected и используйте метод, чтобы определить, выбрано ли оно с помощью метода получения, такого как boolean isSelected(). Затем в методе onBindViewHolder вашего адаптера добавьте что-то вроде этого:

{
    // Code to add inside onBindViewHolder.

    if (cityModel.isSelected())
    {
         // Select the view you want to select.
    }
    else
    {
         // Deselect the view.
    }
}

Всегда используйте условие if-else, чтобы избежать неверных результатов.

0 голосов
/ 06 ноября 2019

Пожалуйста, используйте SparseBooleanArray для поддержания состояния флажка в Recyclerview Android. Вы можете перейти по этой ссылке Использование SparseBooleanArray для сохранения состояния флажка в RecyclerView при прокрутке

0 голосов
/ 06 ноября 2019

Это происходит из-за прокрутки вызова метода onBindViewHolder.

//create integer list for selected city or if there is only one selected city then create variable selected city
private List<integer> SelectedcitiesModelList= new ArrayList<integer>() //in adapter class

// now assign tag to tvCitiesName in onBindViewHolder method 
 viewHolder.tvCitiesName.setTag(i); //to identify the view and i is position

//now in onclick method get textview tag and put in list or variable
SelectedcitiesModelList.add(viewHolder.tvCitiesName.getTag())

//now go to onBindViewHolder method 
for(int p;i<SelectedcitiesModelList.size();p++)
    {
        if(p==i)    
        {
            //this is your selected item
            //do what you want to   
        }   
    }
...