RecyclerView点击事件之修改被点击的item样式

在写RecyclerVIew的适配器时,我们都要重写一个方法onBindViewHolder,这个方法在何时会执行呢?只要有一个item进入了手机界面(只要有item进入了手机界面,那么就会被加载),那么这个方法就会执行,对于的position就是这个item的下标。

比如现在有界面中14个测试item

RecyclerView点击事件之修改被点击的item样式_第1张图片

 我们在onBindViewHolder方法中通过Log.d输出以下内容

Log.d("onBindViewHolder","item"+position);

可以看到确实输出了14个item,我们继续将界面上滑,

RecyclerView点击事件之修改被点击的item样式_第2张图片

又有两个item进入了界面,有如下输出:

还有一个方法叫做notifyDataSetChanged(),一旦适配器调用这个方法,就会通知item项已经更新,那么有多少个item被加载了,onBindViewHolder方法就会重新执行多少次。这也就是相当于调用一次notifyDataSetChanged()方法,就可以通过onBindViewHolder方法去遍历所有已被加载的item。

而点击修改item样式的思路就是先找到被点击的item,然后修改它的样式,而其他的就修改为未被点击的样式,这样将上一个被点击的item的样式也修改过来了。

但是如何让onBindViewHolder方法知道当前点击的时哪个item呢?我们知道每一个item都会有一个position,为item设置点击事件 ,然后通过接口回调的方式可以将所点击的item的position从onBindViewHolder方法拿到适配器实例化所在类中使用。

public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
       holder.tv.setOnClickListener(new View.OnClickListener() {
          @Override
          public void onClick(View v) {
                listener.getPosition(position); // 这个listener是自定义的回调接口
            }
       });
}
adapter.setOnItemClickListener(new TestRecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void getPosition(int position) {
                // 这里可以使用了。
            }
});

 而在点击完成后,在再次onBindViewHolder执行方法的时候,想让onBindViewHolder方法知道这个position是哪个item的,我们可以在适配器设置一个变量mPosition,然后为这个变量创建设置set和获取get方法。

private int mPosition;

public int getPosition(){
    return mPosition;
}

public void setPosition(int mPosition) {
    this.mPosition = mPosition;
}

然后点击的时候就可以通过实例化对象调用设置变量方法来将position传递到适配器中去,然后在item的点击事件的onlick方法中通过获取方法拿到这个position。至此,在方法中可以知道当前点击的是哪个item了,进而在方法中判断当前变量到的item的position和点击的item的position是否相同,然后执行相应的修改即可。

完整代码如下:

适配器代码:

package com.example.scrolllayoutapplication;

import android.content.Context;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

import java.util.List;

public class TestRecyclerViewAdapter extends RecyclerView.Adapter {

    private List mList;
    private Context context;
    private OnItemClickListener listener;
    private static int cnt = 0;

    public TestRecyclerViewAdapter(List mList, Context context){
        this.mList = mList;
        this.context = context;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        TextView tv;
        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }

    // 回调接口
    public interface OnItemClickListener{
        void getPosition(int position);
    }

    public void setOnItemClickListener(OnItemClickListener listener){
        this.listener = listener;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.test_click,parent,false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        holder.tv.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listener.getPosition(position);
            }
        });

        // 判断当前遍历的item的position和点击的item的position是否相同 
        // 相同则要修改为选中的样式  
        if(position == getPosition()) {
            holder.tv.setBackgroundResource(R.color.black);
        }
        else {
            holder.tv.setBackgroundResource(R.color.white);
        }
    }


    @Override
    public int getItemCount() {
        return mList.size();
    }
    
    private int mPosition;// 当前点击的item的position

    public int getPosition(){
        return mPosition;
    }

    public void setPosition(int mPosition) {
        this.mPosition = mPosition;
    }
    
}

测试入口类代码:

package com.example.scrolllayoutapplication;

import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import android.os.Bundle;

import java.util.ArrayList;
import java.util.List;

public class MainActivity6 extends AppCompatActivity {

    private ListmList = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main6);
        for(int i = 0; i < 100; i++) {
            mList.add("1");
        }
        RecyclerView ry = (RecyclerView) findViewById(R.id.ry);
        TestRecyclerViewAdapter adapter = new TestRecyclerViewAdapter(mList,this);
        ry.setAdapter(adapter);
        ry.setLayoutManager(new LinearLayoutManager(this));

        adapter.setOnItemClickListener(new TestRecyclerViewAdapter.OnItemClickListener() {
            @Override
            public void getPosition(int position) {
                // 设置当前点击的item的position
                adapter.setPosition(position);

                // 通知适配器去修改,然后就会去执行onBindViewHolder方法
                adapter.notifyDataSetChanged();
            }
        });
    }
}

你可能感兴趣的:(Android,RecyclerView,Android)