【已解决】 Android Studio:LinearLayout内的RecycleView item点击后无响应
跟着b站大锯视频写的,不知道为什么点击事件无响应,点了item后会显示下列语句

去网上查了方法,在item的根布局加了下面一句代码
android:descendantFocusability="blockDescendants"
如下图

加在了item.xml的根元素上,不过小白俺不知道加的位置对不对,干脆给嵌套有RecycleView的LinearLayout和ScrollView也加了上面那句代码,如下图,依旧没解决(嵌套有RecycleView的LinearLayout也是位于一个ScorllView里面的)

求大佬相助qaq
适配器代码如下
package com.example.animaland.Adapters;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;
import com.example.animaland.R;
import com.example.animaland.room.ShellStudyRoom;
import com.example.animaland.room.room;
import java.util.List;
public abstract class RecycleViewBaseAdapter extends RecyclerView.Adapter<RecycleViewBaseAdapter.InnerHolder> {
private final List<room> mdata;
private onItemClickListener monItemClickListener;
public RecycleViewBaseAdapter(List<room> roomData){
this.mdata=roomData;
}
@NonNull
@Override
public RecycleViewBaseAdapter.InnerHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view=getSubView(parent,viewType);
return new InnerHolder(view);
}
protected abstract View getSubView(ViewGroup parent,int ViewType);
@Override
public void onBindViewHolder(@NonNull RecycleViewBaseAdapter.InnerHolder holder, int position) {
//绑定holder
holder.setData(mdata.get(position),position);
}
@Override
public int getItemCount() {
if(mdata!=null)
return mdata.size();
return 0;
}
public void setOnItemClickListener(onItemClickListener listener) {
//设置一个监听
this.monItemClickListener=listener;
}
public interface onItemClickListener{
void onItemClick(int position);
}
public class InnerHolder extends RecyclerView.ViewHolder {
private TextView idView;
private TextView roomNameView;
private TextView memberNumberView;
private ImageView imageView;
private int mposition;
public InnerHolder(@NonNull View itemView) {
super(itemView);
//找到条目的控件
idView= itemView.findViewById(R.id.room_id);//房间ID
roomNameView= itemView.findViewById(R.id.room_name);//房间名字
memberNumberView= itemView.findViewById(R.id.room_memberNumber);//房间人数
imageView=itemView.findViewById(R.id.room_background);
itemView.setOnClickListener(view -> {
if (monItemClickListener != null) {
monItemClickListener.onItemClick(mposition);
}
});
}
public void setData(room room,int position) {
this.mposition=position;
idView.setText("ID: "+room.id);
roomNameView.setText(room.roomName+"");
memberNumberView.setText(room.roomMember+"/4");
imageView.setImageResource(room.icon);
}
}
}
补充下Activity里的代码
package com.example.animaland.room;
import android.app.Activity;
import android.app.AppComponentFactory;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.ScrollView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import com.example.animaland.Adapters.GridViewAdapter;
import com.example.animaland.Adapters.ListViewAdapter;
import com.example.animaland.Adapters.RecycleViewBaseAdapter;
import com.example.animaland.MainActivity;
import com.example.animaland.R;
import java.util.ArrayList;
import java.util.List;
public class TreeHouseStudyRoom extends AppCompatActivity{
private RecyclerView mlist;
private List<room> mroomList;
private RecycleViewBaseAdapter madapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.treehouse_study_room);
mlist=findViewById(R.id.rv_treehouse);
initData();//模拟数据
showGrid(true,false);
}
//模拟数据
private void initData() {
mroomList= new ArrayList<>();//创建房间数据集合
for(int i=0;i<8;i++){
room roomData=new room();
roomData.id=i;
roomData.roomName="珊迪的树屋";
roomData.roomMember=i%4+1;
roomData.icon=roomPictures.roomPics[1];//加载图片
mroomList.add(roomData);//将房间数据添加到房间数据集合中
}
}
private void initListener() {
madapter.setOnItemClickListener(position -> {
//当条目被点击后展示下列效果
Toast.makeText(TreeHouseStudyRoom.this,"ID "+position+" 被点击了",Toast.LENGTH_SHORT).show();
});
}
private void showGrid(boolean isVertical,boolean isReverse) {
//设置布局管理器
GridLayoutManager layoutManager=new GridLayoutManager(this,3);
//设置水平还是垂直
layoutManager.setOrientation(isVertical?GridLayoutManager.VERTICAL:GridLayoutManager.HORIZONTAL);
//设置正向还是反向
layoutManager.setReverseLayout(isReverse);
mlist.setLayoutManager(layoutManager);
//创建适配器Adapter
madapter=new GridViewAdapter(mroomList);
//设置适配器
mlist.setAdapter(madapter);
//创建条目的点击事件
initListener();
}
}
QAQ家人们终于解决了
我的item布局是一个占满item的图片,上面叠了三个文字。偶然发现,点击事件并非无响应,而是只有点击item之间的空隙才会有Toast弹出 于是我把红框框圈出来的“itemView”改成了“imageView”即第一个红框框所圈出来的变量 实现了我想要的点击item有响应的效果
item布局添加上clickable=true?
点击事件呢?