Повторите фон на элементе с помощью прокрутки RecycleAdapter и прокрутите
У меня есть customrecycleAdapter, и когда я нажимаю на элемент, я меняю цвет строки, но если я прокручиваю вид фона, меняю положение или появляюсь на другом элементе. Я читал о Receycle of view, но так, что является решением этой проблемы?
мой адаптер:
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);
}
}
}
Поэтому я нажимаю на элемент и правильно устанавливаю setBackground, но если я прокручиваю, я вижу другой элемент с установленным фоном и, если прокручиваю вверх свой элемент, у которого я выбрал, не будет фона.
1 ответ
RecyclerView повторно использует представление, чтобы закрасить следующие элементы вашего списка, которые будут отображаться, поэтому в наборе с новыми данными, но по-прежнему сохраняются старые стили, из-за чего вы видите другой элемент списка с новым цветом.
Вы должны создать массив хранения, если этот элемент проверен или нет, и они проверяют, был ли проверен, когда onBindViewHolder()
называется
@Override
public void onBindViewHolder(final YourViewHolder holder, final int position) {
if(checked[position]){
//YourViewHolder change colour
}
}