Android:Recycler视图';用户界面不';单击项目时是否不更改?

Android:Recycler视图';用户界面不';单击项目时是否不更改?,android,android-recyclerview,Android,Android Recyclerview,当我点击回收者视图的项目时,我试图改变该项目的背景。数据实际上发生了更改,但用户界面没有。我尝试了很多不同的方法,但都没有效果。虽然我正在调用notifyItemChanged(),但它不起作用 任何解决办法都会很有帮助 **我的代码:** @覆盖 public void onBindViewHolder(@NonNull final ViewHolder ViewHolder,final int i){ customNoteView=notesList.get(i); notesText=vi

当我点击回收者视图的项目时,我试图改变该项目的背景。数据实际上发生了更改,但用户界面没有。我尝试了很多不同的方法,但都没有效果。虽然我正在调用notifyItemChanged(),但它不起作用

任何解决办法都会很有帮助

**我的代码:**

@覆盖
public void onBindViewHolder(@NonNull final ViewHolder ViewHolder,final int i){
customNoteView=notesList.get(i);
notesText=viewHolder.notesWriteArea;
notesImage=viewHolder.notesImage;
notesAudio=viewHolder.notesAudio;
notesAudioPlayButton=viewHolder.notesAudioPlayButton;
notesAudioSeekBar=viewHolder.notesAudioSeekBar;
notesAudioDeleteButton=viewHolder.notesAudioDeleteButton;
if(customNoteView.getNoteText()!=null){
editTextList.add(notesText);
notesText.setVisibility(View.VISIBLE);
notesImage.setVisibility(View.GONE);
notesAudio.setVisibility(View.GONE);
notesText.requestFocus();
focussedEditText=notesText;
notesText.setOnFocusChangeListener(新视图.OnFocusChangeListener(){
@凌驾
public void onFocusChange(视图,布尔b){
如果(b){
focussedEditText=((CustomEditText)视图);
//Toast.makeText(context,((CustomEditText)视图).getText().toString(),Toast.LENGTH_SHORT.show();
}
}
});
}
else if(customNoteView.getImageUri()!=0){
notesImage.setVisibility(View.VISIBLE);
notesText.setVisibility(View.GONE);
notesAudio.setVisibility(View.GONE);
Glide.with(notesImage.getContext())
.load(notesImage.getContext().getDrawable(customNoteView.getImageUri()))
.进入(注1);
notesImage.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
意图=新意图(上下文,全屏.class);
ActivityOptions Compat options=ActivityOptions Compat.MakeScenetTransitionAnimation((活动)上下文,
注:,
ViewCompat.getTransitionName(notesImage)
);
context.startActivity(intent,options.toBundle());
}
});
}
else if(customNoteView.getAudioUri()!=null){
notesAudio.setVisibility(View.VISIBLE);
notesImage.setVisibility(View.GONE);
notesText.setVisibility(View.GONE);
notesAudioPlayButton.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
setBackground(context.getDrawable(R.drawable.ic_pause));
notesAudio.setBackground(context.getDrawable(R.drawable.gray_矩形_背景));
notifyItemChanged(viewHolder.getAdapterPosition());
Toast.makeText(上下文“”+viewHolder.getAdapterPosition(),Toast.LENGTH_SHORT.show();
}
});
}
}

如果您想获得该类型的行为,您可以尝试在类中添加字段,并在每次在
onBindViewHolder方法中绑定项时检查该字段:

if (current.isClicked) {
    viewHolder.itemView.setBackgroundColor(*needed_color*);
} else {
    viewHolder.itemView.setBackgroundColor(*default_color*);
}

viewHolder.itemView.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        current.isClicked = !current.isClicked;
        notifyItemChanged(viewHolder.getAdapterPosition());
    }
});
  • current
    -列表中
    i
    位置上的项目

  • 项目视图
    -项目的根视图

    如果您需要更多详细信息,请随时询问和评论。(答案被编辑和清理了几次)


尝试以下代码:

1) MainActivity.class:

public class MainActivity extends AppCompatActivity {

private final String TAG = MainActivity.class.getSimpleName();
private RecyclerView rv;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    rv = (RecyclerView) findViewById(R.id.rv);
    rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
    List<String> data = new ArrayList<>();
    List<Boolean> selection_states = new ArrayList<>();
    for (int i = 0; i < 10; i++) {
        data.add("Item " + (i + 1));
        selection_states.add(false);
    }
    rv.setAdapter(new MyRecyclerViewAdapter(MainActivity.this, data, selection_states));
}

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

    private List<String> mData;
    private List<Boolean> mSelectionStates;
    private LayoutInflater mInflater;

    MyRecyclerViewAdapter(Context context, List<String> data, List<Boolean> selection_states) {
        this.mInflater = LayoutInflater.from(context);
        this.mData = data;
        this.mSelectionStates = selection_states;
    }

    @Override
    @NonNull
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = mInflater.inflate(R.layout.recycler_view_item, parent, false);
        return new ViewHolder(view);
    }

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

        holder.tv.setText(mData.get(position));

        holder.ll.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {

                int previous_selected = -1;
                for (int i = 0; i < getSelectionStates().size(); i++) {
                    if (getSelectionStates().get(i)) {
                        previous_selected = i;
                        break;
                    }
                }
                if (previous_selected == -1) { // nothing is selected
                    setSelectionState(position, true);
                    notifyItemChanged(position);
                } else if (previous_selected != position) { // selected (other than current selected)
                    setSelectionState(previous_selected, false);
                    setSelectionState(position, true);
                    notifyItemChanged(previous_selected);
                    notifyItemChanged(position);
                }
            }
        });

        if (mSelectionStates.get(position)) {
            //Log.i(TAG, "Select " + position);
            holder.ll.setBackgroundColor(ContextCompat.getColor(MainActivity.this, android.R.color.holo_red_dark));
        } else {
            //Log.i(TAG, "De-Select " + position);
            holder.ll.setBackgroundColor(ContextCompat.getColor(MainActivity.this, android.R.color.white));
        }

    }

    private List<Boolean> getSelectionStates() {
        return mSelectionStates;
    }

    private void setSelectionState(int position, boolean state) {
        mSelectionStates.set(position, state);
    }

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


    private class ViewHolder extends RecyclerView.ViewHolder {
        final LinearLayout ll;
        final TextView tv;

        ViewHolder(View itemView) {
            super(itemView);
            ll = (LinearLayout) itemView.findViewById(R.id.ll);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }

    }

}

}
public类MainActivity扩展了AppCompatActivity{
private final String TAG=MainActivity.class.getSimpleName();
私人回收车;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
rv=(RecyclerView)findViewById(R.id.rv);
rv.setLayoutManager(新的LinearLayoutManager(MainActivity.this));
列表数据=新的ArrayList();
列表选择_states=new ArrayList();
对于(int i=0;i<10;i++){
添加数据(“项目”+(i+1));
选择_states.add(false);
}
rv.setAdapter(新的MyRecycleServiceAdapter(MainActivity.this、数据、选择状态));
}
公共类MyRecycleServiceAdapter扩展了RecyclerView.Adapter{
私有列表数据;
私人名单国家;
私人停车场;
MyRecycleServiceAdapter(上下文上下文、列表数据、列表选择状态){
this.mInflater=LayoutInflater.from(上下文);
this.mData=数据;
this.mSelectionStates=选择状态;
}
@凌驾
@非空
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
视图=最小充气器。充气(R.layout.recycler\u View\u项目,父项,false);
返回新的ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,final int位置){
holder.tv.setText(mData.get(position));
holder.ll.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
int-previous_selected=-1;
对于(int i=0;i<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<androidx.recyclerview.widget.RecyclerView
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:id="@+id/rv">
</androidx.recyclerview.widget.RecyclerView>

</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:padding="20dp"
android:id="@+id/ll"
android:layout_height="wrap_content">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/tv"
    android:gravity="center"
    android:textSize="20sp"/>

</LinearLayout>