由于在RecyclerView中没有像listview的OnItemClickListener、OnItemLongClickListener等点击方法,故只能自己创建
这里是写了一个类似相册这样的一个功能
先把其余的无关代码摆出来
- AndroidManifest.xml
这个没什么好说的不占地方了 - MyPicture
public class MyPicture {
private Bitmap myImage;
private String myText;
public MyPicture(Bitmap myImage, String myText) {
this.myImage = myImage;
this.myText = myText;
}
public Bitmap getMyImage() {
return myImage;
}
public void setMyImage(Bitmap myImage) {
this.myImage = myImage;
}
public String getMyText() {
return myText;
}
public void setMyText(String text) {
this.myText = text;
}
}
- activity_recycler_view.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/RV"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
- item_picture.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:orientation="vertical"
android:padding="5dp">
<ImageView
android:id="@+id/image"
android:layout_width="100dp"
android:layout_height="100dp"
android:background="@color/yellow_pkq"
android:scaleType="fitXY" />
<TextView
android:id="@+id/text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:text="标题" />
</LinearLayout>
- MyRecyclerViewAdapter和MyRecyclerView
这两个在下面写
这里正式开始
1. 在MyRecyclerViewAdapter中设置(简洁版)
上代码
- MyRecyclerViewAdapter
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context myContext;
private LayoutInflater layoutInflater;
private List<MyPicture> myData;
public MyRecyclerViewAdapter(Context mContext, List<MyPicture> mData) {
myData = mData;
myContext = mContext;
layoutInflater = LayoutInflater.from(myContext);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(layoutInflater.inflate(R.layout.item_picture, null));
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.image.setImageBitmap(myData.get(position).getMyImage());
holder.text.setText(myData.get(position).getMyText());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(myContext, "" + position, Toast.LENGTH_SHORT).show();
}
});
}
@Override
public int getItemCount() {
return myData.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public TextView text;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
text = itemView.findViewById(R.id.text);
}
}
}
- MyRecyclerView
public class MyRecyclerView extends AppCompatActivity {
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
recyclerView = findViewById(R.id.RV);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
ArrayList<MyPicture> myPictures = new ArrayList<>();
// 添加进myPictures内容
for (int i = 1; i < 22; i++) {
int imageId = getResources().getIdentifier("pkq" + i, "drawable", "com.hrk.recyclerview");
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), imageId);
myPictures.add(new MyPicture(bitmap, "可爱的皮卡丘" + i));
}
recyclerView.setAdapter(new MyRecyclerViewAdapter(this, myPictures));
}
}
好了点击功能实现了
这里我们是通过在onBindViewHolder中给holder添加setOnClickListener方法实现的,没啥好说的其实很简单,那么我们如果非要在main里调用怎么办呢?看下面
2. 在MyRecyclerViewAdapter中创建接口和调用接口的方法实现
上代码
- MainAlbum
public class MyRecyclerView extends AppCompatActivity {
private RecyclerView recyclerView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
recyclerView = findViewById(R.id.RV);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
ArrayList<MyPicture> myPictures = new ArrayList<>();
// 添加进myPictures内容
for (int i = 1; i < 22; i++) {
int imageId = getResources().getIdentifier("pkq" + i, "drawable", "com.hrk.recyclerview");
Bitmap bitmap = BitmapFactory.decodeResource(this.getResources(), imageId);
myPictures.add(new MyPicture(bitmap, "可爱的皮卡丘" + i));
}
MyRecyclerViewAdapter myRecyclerViewAdapter = new MyRecyclerViewAdapter(MyRecyclerView.this, myPictures);
recyclerView.setAdapter(myRecyclerViewAdapter);
myRecyclerViewAdapter.setOnItemClickListener(position -> {
Toast.makeText(this, "" + position, Toast.LENGTH_SHORT).show();
});
}
}
这里稍微有些不同这里是用得myRecyclerViewAdapter的setOnItemClickListener
其实犯了一下懒理解思路就好。
- AlbumAdapter
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.MyViewHolder> {
private Context myContext;
private LayoutInflater layoutInflater;
private List<MyPicture> myData;
private OnItemClickListener myClickListener;
public MyRecyclerViewAdapter(Context mContext, List<MyPicture> mData) {
myData = mData;
myContext = mContext;
layoutInflater = LayoutInflater.from(myContext);
}
@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
return new MyViewHolder(layoutInflater.inflate(R.layout.item_picture, null));
}
@Override
public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
holder.image.setImageBitmap(myData.get(position).getMyImage());
holder.text.setText(myData.get(position).getMyText());
holder.itemView.setOnClickListener(v -> {
// Toast.makeText(myContext, "" + position, Toast.LENGTH_SHORT).show();
myClickListener.OnClick(position);
});
}
@Override
public int getItemCount() {
return myData.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
public ImageView image;
public TextView text;
public MyViewHolder(@NonNull View itemView) {
super(itemView);
image = itemView.findViewById(R.id.image);
text = itemView.findViewById(R.id.text);
}
}
public void setOnItemClickListener(OnItemClickListener myClickListener) {
this.myClickListener = myClickListener;
}
interface OnItemClickListener{
void OnClick(int position);
}
}
这里我们可以看到我们在刚才toast的地方 写了这样一段代码
myClickListener.OnClick(position);
(myClickListener在前面private OnItemClickListener myClickListener过)调用的我们接口里的方法
通过我们自己写的
public void setOnItemClickListener(OnItemClickListener myClickListener) {
this.myClickListener = myClickListener;
}
公有方法去给myClickListener附上我们的OnClick方法供onBindViewHolder中的holder.itemView.setOnClickListener调用;
这就是大致思路
写在最后一些小难点及可能发生的错误
- Q:为什么不使用listview
A:因为被淘汰了这个更为灵活- Q:setLayoutManager干什么用
A: 这里可以选择的选项很多像是常用LinearLayout
GridLayout都可以还有什么瀑布图。。。。。这就是RecyclerView的灵活所在- Q:getResources().getIdentifier()这个方法是干啥的
A: 通过名字获取资源,这里简单了解一下
getIdentifier()第一个参数为ID名,第二个为资源属性是ID或者是Drawable,第三个为包名- Q:MyRecyclerViewAdapter为什么继承RecyclerView.Adapter别的行不行
A: 貌似不行。。。。。。你可以试试- Q:MyViewHolder干什么用的
A: 其实没有也没什么关系直接在onCreateViewHolder中写也可以就是这样比较整洁- Q:没有图片显示不报错
A: getItemCount值看看和我一样么- Q:toast空指针异常
A: Toast.makeText(myContext, "" + position, Toast.LENGTH_SHORT).show();
注意"" +这段代码主要是把position转换为字符串(String包装类转也行)
有时候我们将int类型的值传递给上面的方法,理所当然的认为它会将这个值toast出来或者显示在textview。其实,当我们把int类型的值传递给上面的方法时,java编译器会认为这是一个资源id,编译器就会去寻找这个资源,然后因为找不到正确的resource,于是报错。