Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/208.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java RecyclerView中的选定项目在滚动时发生更改_Java_Android_Android Recyclerview - Fatal编程技术网

Java RecyclerView中的选定项目在滚动时发生更改

Java RecyclerView中的选定项目在滚动时发生更改,java,android,android-recyclerview,Java,Android,Android Recyclerview,我有一个RecyclerView,每个元素代表一个事件。我想让用户通过单击来选择事件。选择后,事件和报告按钮将被着色: 执行单击之前的UI: 执行单击后的UI: 这很简单,据说很有效;我为每个ViewHolder设置了一个OnClickListener,它负责为项目着色,当被触发时,它将触发所属活动中名为onOccurrenceSelected的另一个事件,该活动负责更改按钮的状态 但是,当在RecyclerView的项目中滚动时,其他不相关的项目会被着色,就像它们的OnClickListene

我有一个RecyclerView,每个元素代表一个事件。我想让用户通过单击来选择事件。选择后,事件和报告按钮将被着色:

执行单击之前的UI:

执行单击后的UI:

这很简单,据说很有效;我为每个
ViewHolder
设置了一个
OnClickListener
,它负责为项目着色,当被触发时,它将触发所属活动中名为
onOccurrenceSelected
的另一个事件,该活动负责更改按钮的状态

但是,当在RecyclerView的项目中滚动时,其他不相关的项目会被着色,就像它们的
OnClickListener
被触发一样(尽管它没有),而当回滚时,所选事件会被着色为not selected。当这种情况发生时,唯一应该为项目着色的事件不会被触发

对这种行为有何解释?谢谢

编辑:以下是来自适配器的一些相关代码:

private List<Occurrence> mDataSet;
private Activity activity;

public <OccurrencesActivity extends OnOccurrenceSelectedListener> OccurrencesAdapter(OccurrencesActivity occurrencesActivity, List<Occurrence> occurrences) {
    this.activity = (android.app.Activity) occurrencesActivity;
    mDataSet = occurrences;
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
    Occurrence instance = mDataSet.get(position);
    ...
    setOnClickListener(holder, instance);
    }

private void setOnClickListener(final ViewHolder holder, final Occurrence occurrence) {
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (!occurrence.isSelected()) {
                holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.turquoise));
                holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
                holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
                holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
                holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
            } else {
                holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white));
                holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise));
                holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
                holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
                holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
            }
            occurrence.setSelected(!occurrence.isSelected());

            ((OnOccurrenceSelectedListener)activity).onOccurrenceSelected(mDataSet);
        }
    });
}
私有列表mDataSet;
私人活动;
公共事件捕捉器(发生率发生率、列表事件){
this.activity=(android.app.activity)发生率活动;
mDataSet=出现次数;
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
事件实例=mDataSet.get(位置);
...
setOnClickListener(持有者,实例);
}
私有void setOnClickListener(最终视图持有者,最终事件){
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
如果(!occurrence.isSelected()){
holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.turquoise));
holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.white));
}否则{
holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white));
holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise));
holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
}
occurrence.setSelected(!occurrence.isSelected());
((OnOccurrenceSelectedListener)活动);
}
});
}

Recyclerview在滚动时始终恢复视图,因此您必须将所选位置存储到临时arraylist中,然后在onBindViewHolder中保留条件检查,以确定该特定位置是否已存在于arraylist中?我更新了你的适配器。查找以下带有注释的更改

    private List<Occurrence> mDataSet;
private Activity activity;

//Added here temporary ArrayList
private ArrayList<String> mSelectedPosition = new ArrayList<String>;

public <OccurrencesActivity extends OnOccurrenceSelectedListener> OccurrencesAdapter(OccurrencesActivity occurrencesActivity, List<Occurrence> occurrences) {
    this.activity = (android.app.Activity) occurrencesActivity;
    mDataSet = occurrences;
}

@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {


    //Set ViewTag
    holder.itemView.setTag(position);

    //Check everyposition during view binding process
    if(mSelectedPosition.contains(String.valueOf(position))){

     holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white));
                holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise));
                holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
                holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
                holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));


     }else{
    holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white));
                    holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise));
                    holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
                    holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
                    holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));

      }

    Occurrence instance = mDataSet.get(position);
    ...
    setOnClickListener(holder, instance);
    }

private void setOnClickListener(final ViewHolder holder, final Occurrence occurrence) {
    holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

       // Get Position
         int position = (int) view.getTag();

            //Remove SelectedPosition if Already there
              if(mSelectedPosition.contains(position))
                  mSelectedPosition.remove(String.valueOf(position));
               else
                  mSelectedPosition.add(String.valueOf(position));

                notifyDataSetChanged();

               //Not sure about this lines 
                occurrence.setSelected(!occurrence.isSelected());

                ((OnOccurrenceSelectedListener)activity).onOccurrenceSelected(mDataSet);
            }
        });
    }
私有列表mDataSet;
私人活动;
//在此添加临时数组列表
private ArrayList mSelectedPosition=新建ArrayList;
公共事件捕捉器(发生率发生率、列表事件){
this.activity=(android.app.activity)发生率活动;
mDataSet=出现次数;
}
@凌驾
公共无效onBindViewHolder(最终视图持有人,最终整型位置){
//设置视图标记
holder.itemView.setTag(位置);
//在视图绑定过程中检查每个位置
if(mSelectedPosition.contains(String.valueOf(position))){
holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white));
holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise));
holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
}否则{
holder.itemView.setBackgroundColor(App.getContext().getResources().getColor(R.color.white));
holder.titleTextView.setTextColor(App.getContext().getResources().getColor(R.color.turquoise));
holder.statusTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
holder.dateTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
holder.timeTextView.setTextColor(App.getContext().getResources().getColor(R.color.grey));
}
事件实例=mDataSet.get(位置);
...
setOnClickListener(持有者,实例);
}
私有void setOnClickListener(最终视图持有者,最终事件){
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
//获得位置
int position=(int)view.getTag();
//删除已选择的位置(如果已存在)
if(mSelectedPosition.contains(位置))
mSelectedPosition.remove(String.valueOf(position));
其他的
mSelectedPosition.add(String.valueOf(position));
notifyDataSetChanged();
//我不太清楚这句话
occurrence.setSelected(!occurrence.isSelected());
((OnOccurrenceSelectedListener)活动);
}
});
holder.yourItem.setTag(position);
public void onClick(View view) {
    if (!occurrence.isSelected()) {
        //save position in share pref.
    } 
}