BUG recyclerview 中的某些行在平板电脑中的视图寻呼机内不可点击
BUG Some row in recyclerview not clickable inside view pager in tablet
我有一个带有视图寻呼机的布局,由 2 个带有回收器视图的片段组成
前四行是可点击的,但另一行是不可点击的,这是在平板电脑模式下发生的。
在 Phone 模式下,一切正常。
奇怪的是,如果数据很短(只有 1 个字母),所有内容都可以点击,但是数据很长(超过 3 个字母),那么从第 4 行开始就不能点击了。FAB 按钮起作用了。我已经尝试过使用实体平板电脑和模拟平板电脑。
我正在使用 View Pager 2
这是一个错误吗?以及如何解决这个问题?
已编辑,我的 RecyclerView 适配器代码
private List<Craft> craftList;
private RecyclerViewClickListener clickListener;
private Context mContext;
public int selectedItem = -1;
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView name ;
public View container;
private RecyclerViewClickListener mListener;
public MyViewHolder(View view, RecyclerViewClickListener listener) {
super(view);
mListener = listener;
name = (TextView) view.findViewById(R.id.name);
container = view.findViewById(R.id.container);
container.setOnClickListener(this);
}
@Override
public void onClick(View v) {
selectedItem = getBindingAdapterPosition();
if(selectedItem!= RecyclerView.NO_POSITION){
mListener.OnButtonClick(v, getBindingAdapterPosition());
notifyDataSetChanged();
}
}
}
public interface RecyclerViewClickListener {
void OnButtonClick(View view, int position);
}
public CraftAdapter(List<Craft> craftList, RecyclerViewClickListener listener) {
this.craftList = craftList;
clickListener = listener;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.craft_item, parent, false);
mContext = parent.getContext();
return new MyViewHolder(itemView,clickListener);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Craft craft = craftList.get(position);
holder.name.setText(craft.getName());
if(mContext.getResources().getBoolean(R.bool.is_tablet)){
if(selectedItem == position){
holder.container.setBackgroundResource(R.color.light_blue);
}
else{
holder.container.setBackgroundResource(R.color.white);
}
}
}
@Override
public int getItemCount() {
return craftList.size();
}
浪费了这么多时间。我终于找到了根本原因。
原因是使用 LinearLayout
和 weight
的布局。 weight
使它不起作用,我认为这是一个错误。但我可以使用 constraintlayout
解决它
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:id="@+id/coordinator_layout">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="CraftFragment"
android:id="@+id/list_fragment"
android:layout_weight="2" -->>This is the root cause
android:layout_width="0dp" -->> This is the root cause
android:layout_height="match_parent"
/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/dark_grey2"/>
<FrameLayout
android:id="@+id/detail_fragment"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
所以我改成:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:id="@+id/coordinator_layout">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="CraftFragment"
android:id="@+id/list_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/detail_fragment"
app:layout_constraintHorizontal_weight="2"/>
<FrameLayout
android:id="@+id/detail_fragment"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintLeft_toRightOf="@+id/list_fragment"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_weight="3"/>
<View
android:id="@+id/divider"
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/dark_grey2"
app:layout_constraintLeft_toRightOf="@id/list_fragment"
app:layout_constraintRight_toRightOf="@id/list_fragment"/>
</androidx.constraintlayout.widget.ConstraintLayout>
我有一个带有视图寻呼机的布局,由 2 个带有回收器视图的片段组成
前四行是可点击的,但另一行是不可点击的,这是在平板电脑模式下发生的。 在 Phone 模式下,一切正常。
奇怪的是,如果数据很短(只有 1 个字母),所有内容都可以点击,但是数据很长(超过 3 个字母),那么从第 4 行开始就不能点击了。FAB 按钮起作用了。我已经尝试过使用实体平板电脑和模拟平板电脑。
我正在使用 View Pager 2
这是一个错误吗?以及如何解决这个问题?
已编辑,我的 RecyclerView 适配器代码
private List<Craft> craftList;
private RecyclerViewClickListener clickListener;
private Context mContext;
public int selectedItem = -1;
public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView name ;
public View container;
private RecyclerViewClickListener mListener;
public MyViewHolder(View view, RecyclerViewClickListener listener) {
super(view);
mListener = listener;
name = (TextView) view.findViewById(R.id.name);
container = view.findViewById(R.id.container);
container.setOnClickListener(this);
}
@Override
public void onClick(View v) {
selectedItem = getBindingAdapterPosition();
if(selectedItem!= RecyclerView.NO_POSITION){
mListener.OnButtonClick(v, getBindingAdapterPosition());
notifyDataSetChanged();
}
}
}
public interface RecyclerViewClickListener {
void OnButtonClick(View view, int position);
}
public CraftAdapter(List<Craft> craftList, RecyclerViewClickListener listener) {
this.craftList = craftList;
clickListener = listener;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.craft_item, parent, false);
mContext = parent.getContext();
return new MyViewHolder(itemView,clickListener);
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
Craft craft = craftList.get(position);
holder.name.setText(craft.getName());
if(mContext.getResources().getBoolean(R.bool.is_tablet)){
if(selectedItem == position){
holder.container.setBackgroundResource(R.color.light_blue);
}
else{
holder.container.setBackgroundResource(R.color.white);
}
}
}
@Override
public int getItemCount() {
return craftList.size();
}
浪费了这么多时间。我终于找到了根本原因。
原因是使用 LinearLayout
和 weight
的布局。 weight
使它不起作用,我认为这是一个错误。但我可以使用 constraintlayout
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:id="@+id/coordinator_layout">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="CraftFragment"
android:id="@+id/list_fragment"
android:layout_weight="2" -->>This is the root cause
android:layout_width="0dp" -->> This is the root cause
android:layout_height="match_parent"
/>
<View
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/dark_grey2"/>
<FrameLayout
android:id="@+id/detail_fragment"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_height="match_parent" />
</LinearLayout>
</androidx.coordinatorlayout.widget.CoordinatorLayout>
所以我改成:
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:id="@+id/coordinator_layout">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<fragment android:name="CraftFragment"
android:id="@+id/list_fragment"
android:layout_weight="2"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@+id/detail_fragment"
app:layout_constraintHorizontal_weight="2"/>
<FrameLayout
android:id="@+id/detail_fragment"
android:layout_weight="3"
android:layout_width="0dp"
android:layout_height="match_parent"
app:layout_constraintLeft_toRightOf="@+id/list_fragment"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintHorizontal_weight="3"/>
<View
android:id="@+id/divider"
android:layout_width="1dp"
android:layout_height="match_parent"
android:background="@color/dark_grey2"
app:layout_constraintLeft_toRightOf="@id/list_fragment"
app:layout_constraintRight_toRightOf="@id/list_fragment"/>
</androidx.constraintlayout.widget.ConstraintLayout>