【问题标题】:android spinner in recyclerView does not work properlyrecyclerView 中的 android spinner 无法正常工作
【发布时间】:2018-11-07 13:43:56
【问题描述】:

我正在尝试在我的 recyclerView 中使用 Spinner(带下拉菜单的 3 个点),但是当我加载此 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中的每个项目都包含一个想要模仿菜单下拉菜单的微调器?
  • 托马斯,是的,你是对的
  • 我认为为每个 recyclerview 项目而不是微调器实现弹出菜单是一个更好的主意。
  • 正如文档所说“提供类似于 Spinner 的下拉菜单,但不保留持久选择。”
  • Tomas,但弹出菜单需要每个项目的明确坐标,这在回收站视图中是不可能的。也许您知道任何不需要的弹出菜单示例吗?

标签: android android-recyclerview spinner adapter


【解决方案1】:

最好为列表中的每个项目使用PopUpMenu。有一个ImageView 而不是Spinner,它将显示一个“3 点”图标。当有人点击这些点时,PopUpMenu 会...弹出!

分步:

1) 将 xml 布局中的 Spinner 替换为 ImageView,这将显示三点图标。

2) 在您的 RecyclerView.Adapter&lt;SalesViewHolder&gt; 中定义一个监听器类并在其中保存一个实例。

3) 在SalesViewHolder 内部设置一个OnClickListener 来响应点击。

4) 从 Activity 中弹出。

您的新适配器应如下所示

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();
    }

}

不要忘记提供菜单操作等...如提到的here

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多