Java 视图隐藏时,回收器视图未取消选择
我有一个显示四个数字的回收器视图。1,2,3,4. 当我选择其中任何一个数字时,一切似乎都很好。问题是当我水平滚动时,其他数字填充我的屏幕:4,5,6,7 状态1 State2 在本例中,在状态1和状态2之间来回滚动,当只应选择其中一个时,7和1都被选中 问题:如何使单击其中一个数字可以取消选择屏幕上看不到的数字 适配器:Java 视图隐藏时,回收器视图未取消选择,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有一个显示四个数字的回收器视图。1,2,3,4. 当我选择其中任何一个数字时,一切似乎都很好。问题是当我水平滚动时,其他数字填充我的屏幕:4,5,6,7 状态1 State2 在本例中,在状态1和状态2之间来回滚动,当只应选择其中一个时,7和1都被选中 问题:如何使单击其中一个数字可以取消选择屏幕上看不到的数字 适配器: public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{ pr
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder>{
private String[] days;
private String[] numbers;
SelectionTracker<Long> mSelectionTracker;
private static MyAdapter myAdapter;
public MyAdapter(String[] day, String[] number){
days = day;
numbers = number;
setHasStableIds(true);
}
//Set Keys
public void setSelectionTracker(SelectionTracker<Long> selectionTracker) {
mSelectionTracker = selectionTracker;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
String dayInit = days[position];
String numberInit = numbers[position];
Long id = getItemId(position);
boolean isSelected = false;
if(mSelectionTracker != null) {
if (mSelectionTracker.isSelected(id)) {
isSelected = true;
}
}
holder.bind(position, id, dayInit, numberInit, isSelected);
}
public static class MyViewHolder extends RecyclerView.ViewHolder{
public TextView dayView, numberView;
public View view;
ScheduleDetails scheduleDetails = new ScheduleDetails();
public MyViewHolder(View itemView){
super(itemView);
view = itemView;
dayView = itemView.findViewById(R.id.day);
numberView = itemView.findViewById(R.id.day_number);
}
void bind(int position, Long key, String dayInit, String numberInit, Boolean isSelected){
scheduleDetails.position = position;
scheduleDetails.identifier = key;
System.out.println("Check: " + position);
dayView.setText(dayInit);
numberView.setText(numberInit);
view.setActivated(isSelected);
}
public ItemDetailsLookup.ItemDetails<Long> getItemDetails(@NonNull MotionEvent motionEvent){
return scheduleDetails;
}
}
static class ScheduleDetails extends ItemDetailsLookup.ItemDetails<Long>{
int position;
Long identifier;
@Override
public int getPosition() {
return position;
}
@Nullable
@Override
public Long getSelectionKey() { return identifier; }
@Override
public boolean inSelectionHotspot(@NonNull MotionEvent e){
return true;
}
}
// Create new views (invoked by the layout manager)
@Override
public MyAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.recycler_layout, parent, false);
MyViewHolder vh = new MyViewHolder(view);
return vh;
}
@Override
public int getItemCount() {
return days.length;
}
@Override
public long getItemId(int position) {
return position;
}
公共类MyAdapter扩展了RecyclerView.Adapter{
私人字符串[]天;
私有字符串[]个数字;
选择跟踪器mSelectionTracker;
私有静态MyAdapter MyAdapter;
公共MyAdapter(字符串[]天,字符串[]号){
天=天;
数字=数字;
setHasStableIds(true);
}
//设置关键点
公共作废设置SelectionTracker(SelectionTracker SelectionTracker){
mSelectionTracker=selectionTracker;
}
@凌驾
公共无效onBindViewHolder(MyViewHolder,int位置){
字符串dayInit=天[位置];
字符串numberInit=数字[位置];
长id=getItemId(位置);
布尔值=假;
if(mSelectionTracker!=null){
if(mSelectionTracker.isSelected(id)){
isSelected=true;
}
}
持有者绑定(位置、id、dayInit、numberInit、isSelected);
}
公共静态类MyViewHolder扩展了RecyclerView.ViewHolder{
公共文本视图日视图、数字视图;
公众观点;
ScheduleDetails ScheduleDetails=新的ScheduleDetails();
公共MyViewHolder(查看项目视图){
超级(项目视图);
视图=项目视图;
dayView=itemView.findViewById(R.id.day);
numberView=itemView.findViewById(R.id.day\U编号);
}
void bind(int位置、长键、字符串dayInit、字符串numberInit、布尔值isSelected){
scheduleDetails.position=位置;
scheduleDetails.identifier=密钥;
系统输出打印项次(“检查:+位置);
dayView.setText(dayInit);
numberView.setText(numberInit);
视图。设置已激活(已选择);
}
public ItemDetailsLookup.ItemDetails getItemDetails(@NonNull MotionEvent MotionEvent){
返回时间表详细信息;
}
}
静态类ScheduleDetails扩展了ItemDetailsLookup.ItemDetails{
内部位置;
长标识符;
@凌驾
public int getPosition(){
返回位置;
}
@可空
@凌驾
public Long getSelectionKey(){return identifier;}
@凌驾
公共布尔值插入选择热点(@NonNull motione){
返回true;
}
}
//创建新视图(由布局管理器调用)
@凌驾
public MyAdapter.MyViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext())
.充气(R.layout.recycler_layout,parent,false);
MyViewHolder vh=新的MyViewHolder(视图);
返回vh;
}
@凌驾
public int getItemCount(){
返回天数。长度;
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
}您可以覆盖RecyclerView.Adapter
类中的方法并禁用其中的视图。下面是一个基于您提供的代码的示例:
@Override
public void onViewRecycled(@NonNull MyViewHolder holder) {
//disable activated view when it got recycle
holder.view.setActivated(false)
super.onViewRecycled(holder);
}
现在,每次循环使用视图时,您都会取消选择它,并且当再次绑定此视图时(在MyViewHolder
类的bind
方法中),您只选择了正确的视图。您可以覆盖RecyclerView.Adapter
类中的方法并禁用其中的视图。下面是一个基于您提供的代码的示例:
@Override
public void onViewRecycled(@NonNull MyViewHolder holder) {
//disable activated view when it got recycle
holder.view.setActivated(false)
super.onViewRecycled(holder);
}
现在,每次循环使用视图时,您都会取消选择该视图,当再次绑定该视图时(在
MyViewHolder
类的bind
方法中),您只选择了正确的视图。我尝试了这个方法,但不幸地没有成功。感谢您,完整的解决方案必须在onBindViewHolder上重新选择项目;可能会保留屏幕外选定项目的单独列表。或者使用SelectionTracker本身可以实现更干净的实现?我试过了,但不幸的是没有成功。感谢您,完整的解决方案必须在onBindViewHolder上重新选择项目;可能会保留屏幕外选定项目的单独列表。或者,也许可以使用SelectionTracker本身实现更干净的实现?这似乎是一个重复的问题-您是否尝试过那里提出的解决方案?这似乎是一个重复的问题-您是否尝试过那里提出的解决方案?