#android #android-recyclerview #android-viewpager2
Вопрос:
У меня есть макет с пейджером просмотра и состоит из 2 фрагментов с видом переработчика
Первый четырехрядный доступен для кликабельности, но другой не доступен для кликабельности, это происходит в режиме планшета. В телефонном режиме все работает нормально.
Странно то, что если данные короткие(только 1 буква), все доступно для кликабельности, но данные длинные(более 3 букв), то они недоступны для кликабельности из строки 4. Кнопка FAB работает. Я уже пробовал использовать физический планшет и эмулированный планшет.
Я использую Просмотр Пейджера 2
Это ошибка? И как это решить?
Отредактирован мой код адаптера RecyclerView
private Listlt;Craftgt; 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(Listlt;Craftgt; 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(); }
Комментарии:
1. Это тоже происходит в разделе «новые»?
2. @Arthurghev что означает раздел «новый»? Это всегда происходит на планшете(физическом и эмулируемом), но на телефоне это работает нормально. Но на телефоне в данный момент есть только 1 фрагмент, левый и правый фрагменты будут отображаться 1 на 1(список и подробности)
3. @SusiS Можете ли вы поделиться своим кодом адаптера для просмотра переработчика?
4. @LucaPizzini Конечно, я добавляю это к своему вопросу
5. @SusiS на картинке есть 2 раздела «новый» и «старый», это тоже происходит в разделе «новый»?
Ответ №1:
После того, как потратил столько времени впустую. Наконец-то я нашел первопричину.
Причиной является компоновка LinearLayout
с использованием weight
с. То weight
, что это не работает, я думаю, что это ошибка. Но я могу решить эту проблему с помощью constraintlayout
lt;?xml version="1.0" encoding="utf-8"?gt; lt;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"gt; lt;LinearLayout android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"gt; lt;fragment android:name="CraftFragment" android:id="@ id/list_fragment" android:layout_weight="2" --gt;gt;This is the root cause android:layout_width="0dp" --gt;gt; This is the root cause android:layout_height="match_parent" /gt; lt;View android:layout_width="1dp" android:layout_height="match_parent" android:background="@color/dark_grey2"/gt; lt;FrameLayout android:id="@ id/detail_fragment" android:layout_weight="3" android:layout_width="0dp" android:layout_height="match_parent" /gt; lt;/LinearLayoutgt; lt;/androidx.coordinatorlayout.widget.CoordinatorLayoutgt;
Поэтому я меняю его на:
lt;?xml version="1.0" encoding="utf-8"?gt; lt;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"gt; lt;androidx.constraintlayout.widget.ConstraintLayout android:layout_width="match_parent" android:layout_height="match_parent"gt; lt;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"/gt; lt;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"/gt; lt;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"/gt; lt;/androidx.constraintlayout.widget.ConstraintLayoutgt;