android recyclerView 中的微调器无法正常工作
android spinner in recyclerView does not work properly
我正在尝试在我的 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 导出到其他地方吗?
最好为列表中的每个项目使用 PopUpMenu。使用 ImageView
而不是 Spinner
将显示“3 点”图标。当有人点击圆点时,PopUpMenu 将...弹出!
步骤:
1) 将 xml 布局中的 Spinner
替换为 ImageView
,这将显示三点图标。
2) 在您的 RecyclerView.Adapter<SalesViewHolder>
中定义一个侦听器 class 并在其中保存一个实例。
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);
}
}
}
}
}
您的 activity 必须实现 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。
我正在尝试在我的 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 导出到其他地方吗?
最好为列表中的每个项目使用 PopUpMenu。使用 ImageView
而不是 Spinner
将显示“3 点”图标。当有人点击圆点时,PopUpMenu 将...弹出!
步骤:
1) 将 xml 布局中的 Spinner
替换为 ImageView
,这将显示三点图标。
2) 在您的 RecyclerView.Adapter<SalesViewHolder>
中定义一个侦听器 class 并在其中保存一个实例。
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);
}
}
}
}
}
您的 activity 必须实现 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。