2016-08-17 3 views
0

Я следую Big Nerd Ranch tutorial on RecyclerView учебнику по RecyclerView. Я изменил несколько вещей и там. Проблема, с которой я сталкиваюсь, заключается в том, что когда я нажимаю на строку; этот элемент выделяется, но затем я не вижу других «невыбранных строк».Выделение строк CardView в RecyclerView

Перед Выбор строки: enter image description here

После выбора строки enter image description here

Я реализую свои щелчки в держателе. Ниже приведен код:

public class CustomRecyclerViewHolder extends SwappingHolder implements View.OnClickListener, View.OnLongClickListener { 

     private TextView mMsg1, mMsg2; 
     //private ImageView mAvatarView; 
     private CheckBox mCheckBox; 
     private LinearLayout checkboxHolder; 
     private ImageView mDeleteRow; 
     private CardView cardView; 
     private Category category; 
     private CustomRecyclerViewHolder holder; 

     public CustomRecyclerViewHolder(View itemView) { 
      super(itemView, myFragment.mMultiSelector); 
      mMsg1 = (TextView) itemView.findViewById(R.id.text_view1); 
      mMsg2 = (TextView) itemView.findViewById(R.id.text_view2); 
      //mAvatarView = (ImageView)itemView.findViewById(R.id.avatar_holder); 
      mCheckBox = (CheckBox) itemView.findViewById(R.id.checkbox); 
      checkboxHolder = (LinearLayout) itemView.findViewById(R.id.checkbox_holder); 
      mDeleteRow = (ImageView) itemView.findViewById(R.id.delete_row); 
      cardView = (CardView) itemView.findViewById(R.id.card_holder); 
      itemView.setOnClickListener(this); 
      itemView.setLongClickable(true); 
      itemView.setOnLongClickListener(this); 
     } 

     public void bindCategory(Category category) { 
      this.category = category; 
      mMsg1.setText(category.getName()); 
      mMsg2.setText(category.getDescriptionName()); 
      if (category.getCompleted() == 1) { 
       mCheckBox.setChecked(true); 
       mCheckBox.setVisibility(View.VISIBLE); 
      } else 
       mCheckBox.setChecked(true); 
     } 

     @Override 
     public void onClick(View v) { 

      if (category == null) { 
       return; 
      } 
      checkboxHolder.setVisibility(View.VISIBLE); 
      mCheckBox.setChecked(isChecked); 
      if (!myFragment.mMultiSelector.tapSelection(this)) { 
       //selectCrime(mCrime); 
      } 

     } 

     @Override 
     public boolean onLongClick(View v) { 

      ((AppCompatActivity) mContext).startSupportActionMode(myFragment.mDeleteMode); 
      myFragment.mMultiSelector.setSelected(this, true); 
      return true; 
     } 
    } 

И тогда в моем фрагменте я это делаю:

public class CustomMultiSelectorCallback extends ModalMultiSelectorCallback { 

     public CustomMultiSelectorCallback(MultiSelector multiSelector) { 
      super(multiSelector); 
     } 

     @Override 
     public boolean onCreateActionMode(ActionMode actionMode, Menu menu) { 
      super.onCreateActionMode(actionMode, menu); 
      actionMode.getMenuInflater().inflate(R.menu.list_item_delete, menu); 
      return true; 
     } 

     @Override 
     public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) { 

      switch (menuItem.getItemId()) { 
       case R.id.menu_item_delete: 
       { 

        for (int i = categoriesArrayList.size(); i >= 0; i--) { 
         if (mMultiSelector.isSelected(i, 0)) { 
          categoryDatabase = new CategoryDatabase(context); 
          Category category = prescriptionsArrayList.get(i); 
          categoryDatabase.deleteCategory(category); 
          categoryRecyclerView.getAdapter().notifyItemRemoved(i); 
         } 
        } 


        categoriesArrayList.clear(); 
        mMultiSelector.clearSelections(); 
        actionMode.finish(); 
        return true; 

       } 
      } 
      return false; 
     } 
    } 
+0

возможный дубликат: http://stackoverflow.com/questions/38829808/recyclerview-on-click-highlight-and-make-others -не не подсвечен/38831493 # 38831493 – JCDecary

+0

Нет, я так не думаю. Это характерно для библиотеки, используемой в приведенном выше руководстве. –

ответ

0

Таким образом, после тонны исследований, я наконец нашел ответ. Если вы используете CardView + Big Nerd Ranch MultiSelector. Когда вы выделяете CardView, нажимая на него, отображается только эта конкретная карта, а не остальные карты в RecyclerView. Это связано с тем, что SwappingHolder работает, заменяя чертежи верхнего уровня. Но CardView использует свои собственные чертежи, поэтому он не будет работать, если вы используете его как вид верхнего уровня.

CardView использует свой собственный фон. SwappingHolder должен иметь возможность заменить этот фон для выполнения своей работы.

Одним из вариантов является реализация интерфейса SelectableHolder самостоятельно и выбор способа отображения выбранного элемента.

Другим вариантом является то, что мы можем создать дочерний элемент CardView для FrameLayout. Что-то вроде этого: <FrameLayout ... > <CardView ... > </CardView> </FrameLayout>

я кратко, что в основном говорит here

0

Я приглашаю вас проверить библиотеку, которую я написал недавно, что реализует множественный выбор (перетащить & падение и ударяя тоже, если вы в конечном итоге, нуждающихся в них). На одном из образцов библиотеки также реализован выбор, поместив на вершину ViewHolder. Тем не менее, используемый подход - это активировать извлечение, когда запускается ActionMode, захватывая события щелчка на этом вытягиваемом для переключения состояний выбора, а затем устанавливая отображаемую видимость в GONE при выходе из ActionMode.

Может быть, проверяя исходный код, который вы можете найти что-то интересное: https://github.com/MikiLoz92/FancyAdapters

Смежные вопросы