Я пытаюсь использовать 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 вместо счетчика.
Как говорится в документации: «Предоставляется раскрывающийся список, аналогичный Spinner, который не сохраняет постоянный выбор».
Томас, но во всплывающем меню требуются четкие координаты для каждого элемента, это невозможно в представлении ресайклера. Может быть, вы знаете какие-нибудь примеры всплывающего меню, которое не требует?
Что вы имеете в виду под «четкими координатами»? Насколько я понимаю, вы хотите, чтобы каждый элемент вашего recyclerview включал меню, верно?
Томас, да, не говоря уже о координатах, вы знаете примеры всплывающих окон?
Я верю, что знаю, позволь мне проверить
Лучше использовать Всплывающее меню для каждого элемента в списке. Используйте 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();
}
}
Не забудьте указать действия меню и т.д., как упоминалось в здесь.
Итак, каждый элемент в recyclerview включает счетчик, который хочет имитировать раскрывающееся меню?