Anonymous
Как исправить это странное поведение с помощью Recyclerview и Gridlayoutmanager?
Сообщение
Anonymous » 23 апр 2025, 09:32
I have a simple app using RecyclerView with GridLayoutManager.
When the app starts, it looks like this:
If I tap on 6, 12, 18 & 24 it looks like Это:
< /p>
Но если я сейчас нажмите на 6, чтобы не выбирать его, это выглядит так:
пункт 5 стал выбран, хотя я не нажимал на него. И 5 теперь не реагирует на постукивание, поэтому я не могу не определить его, но если я теперь нажимаю на 12, 18 и 24, они станут не отобраны, а затем я также могу не поднять 5 снова! Есть ли способ заставить это приложение работать должным образом на Android 5?
Код: Выделить всё
public class RecyclerViewAdapter extends RecyclerView.Adapter {
public interface ActionListenerCallback {
void onItemClick(View v, int index);
}
private static ActionListenerCallback callback;
public void setClickListener(ActionListenerCallback itemClickListener) {
this.callback = itemClickListener;
}
private String[] mData;
private boolean[] mStates;
private LayoutInflater mInflater;
RecyclerViewAdapter(Context context, String[] data, boolean[] states) {
this.mInflater = LayoutInflater.from(context);
this.mData = data;
this.mStates = states;
}
public void setStates(boolean[] states) {
this.mStates = states;
}
@Override
@NonNull
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.grid_cell, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.myTextView.setText(mData[position]);
if (mStates[position] == true)
holder.itemView.setBackgroundColor(Color.parseColor("#FFB3EBF2"));
}
@Override
public int getItemCount() {
return mData.length;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView myTextView;
ViewHolder(View itemView) {
super(itemView);
myTextView = itemView.findViewById(R.id.cellText);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (callback != null) callback.onItemClick(view, getAdapterPosition());
}
}
String getItem(int id) {
return mData[id];
}
}
< /code>
Вот основное действие: < /p>
public class MainActivity extends AppCompatActivity {
private AppBarConfiguration appBarConfiguration;
private ActivityMainBinding binding;
RecyclerViewAdapter adapter;
boolean[] stateArray = new boolean[24];
String[] days = {"Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};
int day_index;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] data = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"};
RecyclerView recyclerView = findViewById(R.id.rvHours);
int numberOfColumns = 6;
recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
recyclerView.addItemDecoration(new SpacesItemDecoration(5));
adapter = new RecyclerViewAdapter(this, data, stateArray);
adapter.setClickListener(new RecyclerViewAdapter.ActionListenerCallback() {
@Override
public void onItemClick(View view, int position) {
stateArray[position] = !stateArray[position];
adapter.setStates(stateArray);
adapter.notifyDataSetChanged();
}
});
recyclerView.setAdapter(adapter);
TextView view = (TextView)findViewById(R.id.tvDay);
view.setText(days[0]);
}
public void DayDownClick(View view) {
if (day_index > 0)
day_index--;
TextView v = (TextView)findViewById(R.id.tvDay);
v.setText(days[day_index]);
}
public void DayUpClick(View view) {
if (day_index < days.length-1)
day_index++;
TextView v = (TextView)findViewById(R.id.tvDay);
v.setText(days[day_index]);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
Спасибо за просмотр!
Подробнее здесь:
https://stackoverflow.com/questions/795 ... outmanager
1745389936
Anonymous
I have a simple app using RecyclerView with GridLayoutManager. When the app starts, it looks like this: [img]https://i.sstatic.net/7Vod3XeK.png[/img] If I tap on 6, 12, 18 & 24 it looks like Это: < /p> Но если я сейчас нажмите на 6, чтобы не выбирать его, это выглядит так: пункт 5 стал выбран, хотя я не нажимал на него. И 5 теперь не реагирует на постукивание, поэтому я не могу не определить его, но если я теперь нажимаю на 12, 18 и 24, они станут не отобраны, а затем я также могу не поднять 5 снова! Есть ли способ заставить это приложение работать должным образом на Android 5?[code] public class RecyclerViewAdapter extends RecyclerView.Adapter { public interface ActionListenerCallback { void onItemClick(View v, int index); } private static ActionListenerCallback callback; public void setClickListener(ActionListenerCallback itemClickListener) { this.callback = itemClickListener; } private String[] mData; private boolean[] mStates; private LayoutInflater mInflater; RecyclerViewAdapter(Context context, String[] data, boolean[] states) { this.mInflater = LayoutInflater.from(context); this.mData = data; this.mStates = states; } public void setStates(boolean[] states) { this.mStates = states; } @Override @NonNull public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = mInflater.inflate(R.layout.grid_cell, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.myTextView.setText(mData[position]); if (mStates[position] == true) holder.itemView.setBackgroundColor(Color.parseColor("#FFB3EBF2")); } @Override public int getItemCount() { return mData.length; } public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { TextView myTextView; ViewHolder(View itemView) { super(itemView); myTextView = itemView.findViewById(R.id.cellText); itemView.setOnClickListener(this); } @Override public void onClick(View view) { if (callback != null) callback.onItemClick(view, getAdapterPosition()); } } String getItem(int id) { return mData[id]; } } < /code> Вот основное действие: < /p> public class MainActivity extends AppCompatActivity { private AppBarConfiguration appBarConfiguration; private ActivityMainBinding binding; RecyclerViewAdapter adapter; boolean[] stateArray = new boolean[24]; String[] days = {"Monday","Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"}; int day_index; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); String[] data = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24"}; RecyclerView recyclerView = findViewById(R.id.rvHours); int numberOfColumns = 6; recyclerView.setLayoutManager(new GridLayoutManager(this, numberOfColumns)); recyclerView.addItemDecoration(new SpacesItemDecoration(5)); adapter = new RecyclerViewAdapter(this, data, stateArray); adapter.setClickListener(new RecyclerViewAdapter.ActionListenerCallback() { @Override public void onItemClick(View view, int position) { stateArray[position] = !stateArray[position]; adapter.setStates(stateArray); adapter.notifyDataSetChanged(); } }); recyclerView.setAdapter(adapter); TextView view = (TextView)findViewById(R.id.tvDay); view.setText(days[0]); } public void DayDownClick(View view) { if (day_index > 0) day_index--; TextView v = (TextView)findViewById(R.id.tvDay); v.setText(days[day_index]); } public void DayUpClick(View view) { if (day_index < days.length-1) day_index++; TextView v = (TextView)findViewById(R.id.tvDay); v.setText(days[day_index]); } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { int id = item.getItemId(); if (id == R.id.action_settings) { return true; } return super.onOptionsItemSelected(item); } } [/code] Спасибо за просмотр! Подробнее здесь: [url]https://stackoverflow.com/questions/79586513/how-do-you-fix-this-weird-behaviour-with-recyclerview-and-gridlayoutmanager[/url]