【发布时间】:2018-08-29 15:40:30
【问题描述】:
由于某些原因,尽管项目显示正常,但单击事件对我的 RecyclerView 不起作用。我根据屏幕尺寸使用了 2 种不同的适配器。有谁知道它为什么不起作用以及如何解决?
recyclerview_item_gridcell(适用于大屏幕)
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:padding="20dp"
android:clickable="true"
android:focusable="true"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<Button
android:id="@+id/info_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
recyclerview_item_textview(适用于小屏幕)
<?xml version="1.0" encoding="utf-8"?>
<TextView
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:focusable="true"
android:background="?android:attr/selectableItemBackground"
/>
活动类
public class MainActivity extends Activity implements MyRecyclerViewAdapterGL.ItemClickListener, MyRecyclerViewAdapterLL.ItemClickListener {
boolean themeState;
MyRecyclerViewAdapterGL adapterGL;
MyRecyclerViewAdapterLL adapterLL;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
boolean isScreenSmall = getResources().getBoolean(R.bool.is_screen_small);
setContentView(R.layout.activity_main);
String[] dataArray = {"Item A", "Item B", "Item C", "Item D" ,"Item E" ,"Item F"};
if(isScreenSmall){
// ItemDecoration for small devices
RecyclerView recyclerViewLL = findViewById(R.id.recyclerView_list);
recyclerViewLL.setLayoutManager(new LinearLayoutManager(this));
adapterLL = new MyRecyclerViewAdapterLL(this, dataArray);
adapterLL.setClickListener(this);
recyclerViewLL.addItemDecoration(new DividerItemDecoration(this, LinearLayout.VERTICAL));
recyclerViewLL.setAdapter(adapterLL);
}
else{
// ItemDecoration for large devices
RecyclerView recyclerViewGL = findViewById(R.id.recyclerView_list);
int numberOfColumns = 2;
recyclerViewGL.setLayoutManager(new GridLayoutManager(this, numberOfColumns));
adapterGL = new MyRecyclerViewAdapterGL(this, dataArray);
adapterGL.setClickListener(this);
recyclerViewGL.setAdapter(adapterGL);
}
}
@Override
public void onItemClick(View view, int position) {
if (position == 0) {
Toast.makeText(MainActivity.this, "Item A was clicked", LENGTH_SHORT).show();
} else if (position == 1) {
Toast.makeText(MainActivity.this, "Item B was clicked", LENGTH_SHORT).show();
} else if (position == 2) {
Toast.makeText(MainActivity.this, "Item C was clicked", LENGTH_SHORT).show();
}
}
}
RecyclerView 适配器类(适用于小屏幕)
public class MyRecyclerViewAdapterLL extends RecyclerView.Adapter<MyRecyclerViewAdapterLL.ViewHolder> {
private String[] mData;
private LayoutInflater mInflater;
private MyRecyclerViewAdapterLL.ItemClickListener mClickListener;
MyRecyclerViewAdapterLL(Context context, String[] data) {
this.mInflater = LayoutInflater.from(context);
this.mData = data;
}
@Override
@NonNull
public MyRecyclerViewAdapterLL.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.recyclerview_item_textview, parent, false);
return new MyRecyclerViewAdapterLL.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull MyRecyclerViewAdapterLL.ViewHolder holder, int position) {
holder.myTextView.setText(mData[position]);
}
@Override
public int getItemCount() {
return mData.length;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView myTextView;
ViewHolder(View itemView) {
super(itemView);
myTextView = itemView.findViewById(R.id.item_text);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
}
String getItem(int id) {
return mData[id];
}
void setClickListener(MyRecyclerViewAdapterLL.ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
public interface ItemClickListener {
void onItemClick(View view, int position);
}
}
RecyclerView 适配器类(适用于大屏幕)
public class MyRecyclerViewAdapterGL extends RecyclerView.Adapter<MyRecyclerViewAdapterGL.ViewHolder> {
private String[] mData;
private LayoutInflater mInflater;
private ItemClickListener mClickListener;
MyRecyclerViewAdapterGL(Context context, String[] data) {
this.mInflater = LayoutInflater.from(context);
this.mData = data;
}
@Override
@NonNull
public MyRecyclerViewAdapterGL.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = mInflater.inflate(R.layout.recyclerview_item_gridcell, parent, false);
return new MyRecyclerViewAdapterGL.ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.myTextView.setText(mData[position]);
}
@Override
public int getItemCount() {
return mData.length;
}
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
TextView myTextView;
ViewHolder(View itemView) {
super(itemView);
myTextView = itemView.findViewById(R.id.info_text);
itemView.setOnClickListener(this);
}
@Override
public void onClick(View view) {
if (mClickListener != null) mClickListener.onItemClick(view, getAdapterPosition());
}
}
String getItem(int id) {
return mData[id];
}
void setClickListener(MyRecyclerViewAdapterGL.ItemClickListener itemClickListener) {
this.mClickListener = itemClickListener;
}
// parent activity will implement this method to respond to click events
public interface ItemClickListener {
void onItemClick(View view, int position);
}
}
【问题讨论】:
-
您的代码看起来不错。需要检查你的根视图是否可点击。请发送您的 xml 单元格
标签: java android xml android-recyclerview android-adapter