Счетчик Android в recyclerView не работает должным образом

Я пытаюсь использовать Spinner (3 точки с раскрывающимся меню) в моем recyclerView, но когда я загружаю эту функцию recyclerView, onItemSelected вызывается автоматически, а позже, когда я нажимаю на элемент, он больше не вызывается. Вот мой код в адаптере:

       @Override
       public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(context, R.array.my_listing_item_array, android.R.layout.simple_spinner_item);
            adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
            ((SaleAdapter.SalesViewHolder) holder).overflow.setAdapter(adapter);

            ((SaleAdapter.SalesViewHolder) holder).overflow.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
                @Override
                public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                    Toast.makeText(context, String.valueOf(position) + " item is selected", Toast.LENGTH_SHORT).show();
                }

                @Override
                public void onNothingSelected(AdapterView<?> adapterView) {

                }
            });

}

  public static class SalesViewHolder extends RecyclerView.ViewHolder {
      public LinearLayout overflowLayout;
      public Spinner overflow;

      public SalesViewHolder(View itemView, Context context) {
          super(itemView);

          overflowLayout = (LinearLayout) itemView.findViewById(R.id.list_item_overflow_layout);
          overflow = (Spinner) itemView.findViewById(R.id.list_item_overflow);
      }
     }

Вот код просмотра:

<LinearLayout
    android:id = "@+id/list_item_overflow_layout"
    android:layout_width = "54dp"
    android:layout_height = "54dp"
    android:layout_gravity = "center_vertical"
    android:orientation = "vertical"
    android:padding = "15dp"
    android:background = "@drawable/ic_more_vert_24dp_grey"
    >

    <Spinner
        android:id = "@+id/list_item_overflow"
        android:layout_width = "24dp"
        android:layout_height = "24dp"
        />


</LinearLayout>

Кто-нибудь знает, в чем проблема с моим кодом? Стоит ли экспортировать setOnItemSelectedListener куда-нибудь еще?

Итак, каждый элемент в recyclerview включает счетчик, который хочет имитировать раскрывающееся меню?

Themelis 07.11.2018 15:19

Томас, да ты прав

Tomas Maksimavicius 07.11.2018 15:43

Я считаю, что лучше реализовать всплывающее меню для каждого элемента recyclerview вместо счетчика.

Themelis 07.11.2018 15:48

Как говорится в документации: «Предоставляется раскрывающийся список, аналогичный Spinner, который не сохраняет постоянный выбор».

Themelis 07.11.2018 15:49

Томас, но во всплывающем меню требуются четкие координаты для каждого элемента, это невозможно в представлении ресайклера. Может быть, вы знаете какие-нибудь примеры всплывающего меню, которое не требует?

Tomas Maksimavicius 07.11.2018 15:52

Что вы имеете в виду под «четкими координатами»? Насколько я понимаю, вы хотите, чтобы каждый элемент вашего recyclerview включал меню, верно?

Themelis 07.11.2018 16:01

Томас, да, не говоря уже о координатах, вы знаете примеры всплывающих окон?

Tomas Maksimavicius 07.11.2018 16:10

Я верю, что знаю, позволь мне проверить

Themelis 07.11.2018 16:27
1
8
2 040
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Лучше использовать Всплывающее меню для каждого элемента в списке. Используйте ImageView вместо Spinner, на котором будет отображаться значок «3 точки». Когда кто-то щелкает по точкам, PopUpMenu ... всплывает!

По шагам:

1) Замените Spinner в макете xml на ImageView, на котором будет отображаться значок из трех точек.

2) Определите класс слушателя внутри вашего RecyclerView.Adapter<SalesViewHolder> и сохраните там экземпляр.

3) Внутри SalesViewHolder настройте OnClickListener на реакцию на щелчки.

4) Всплывающее окно из Активности.

Ваш новый адаптер должен выглядеть примерно так

class SalesAdapter extends RecyclerView.Adapter<SalesViewHolder>{
    public interface OnMenuItemClickListener{
        void onMenuItemClicked(ImageView view);
    }

    private OnMenuItemClickListener listener;

    public void setOnMenuItemClickListener(OnMenuItemClickListener listener){
        this.listener = listener;
    }

    public static class SalesViewHolder extends RecyclerView.ViewHolder {
        public LinearLayout overflowLayout;
        public ImageView menu;

    public SalesViewHolder(View itemView, Context context) {
        super(itemView);

        overflowLayout = (LinearLayout) itemView.findViewById(R.id.list_item_overflow_layout);
        menu= (ImageView) itemView.findViewById(R.id.imageview_id);
        // Make sure to enable lambdas
        menu.setOnClickListener( (view) -> {
            if ( listener != null ){
                listener.onMenuItemClicked(view);
            }
        }
    }
     }

}

Ваша активность должна реализовывать OnMenuItemClickListener и может выглядеть примерно так

class YourActivity extends Activity implements SalesAdapter.OnMenuItemClickListener{

    // Don't forget to set the listener to the adapter,  let's suppose that happens in onCreate()
    @Override
    public void onCreate(Bundle arg){
        SalesAdapter adapter = new SalesAdapter();
        adapter.setOnMenuItemClickListener(this);
    }

    @Override
    public void onMenuItemClicked(ImageView menu){
        showPopUp(menu);
    }

    private void showPopup(View v) {
        PopupMenu popup = new PopupMenu(this, v);
        MenuInflater inflater = popup.getMenuInflater();
        inflater.inflate(R.menu.actions, popup.getMenu());
        popup.show();
    }

}

Не забудьте указать действия меню и т.д., как упоминалось в здесь.

Другие вопросы по теме