Как добавить кнопку меню в список, сохранив onClickListener? - PullRequest
0 голосов
/ 05 мая 2020

Я создаю приложение для воспроизведения музыки c.

При входе в приложение отображается список (ListView) всех списков воспроизведения. При нажатии на элемент (список воспроизведения) в ListView открывается список воспроизведения и отображаются все песни. Все это работает.

Сейчас я пытаюсь добавить меню справа от каждого элемента. При нажатии на кнопку меню я хочу, чтобы запускался «code b», при щелчке по элементу я хочу, чтобы запускался «code a». Вот как я создаю элементы:

public static void createList(final MainActivity mainActivity, ListView listView) {

    final ArrayList<Playlist> playlists = getLists();

    playlists.sort(new Comparator<Playlist>() {
        @Override
        public int compare(Playlist playlist1, Playlist playlist2) {
            return playlist1.name.compareTo(playlist2.name);
        }
    });

    ArrayList<String> playlistsText = new ArrayList<>();
    for (Playlist playlist : playlists)
        playlistsText.add(playlist.name);

    ArrayAdapter<String> adapter = new ArrayAdapter<>(mainActivity, android.R.layout.simple_list_item_1, playlistsText);
    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            new PlaylistFragment(mainActivity, playlists.get(position));
        }
    });

}

Вот код XML:

<ListView
    android:id="@+id/playlist_list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:dividerHeight="1dp" />

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

Это меню будет использоваться для таких вещей, как «Удалить список воспроизведения» и « Копировать список воспроизведения ".

Заранее спасибо!

1 Ответ

0 голосов
/ 07 мая 2020

Благодаря комментарию zgc7009 для этого переполнения стека я смог настроить, какой элемент находился внутри списка, что позволило мне получить полный контроль над списком. Ниже я разместил код, чтобы другие люди могли его повторно использовать:

public class ListAdapter extends BaseAdapter {

    Context context;
    Map<String, View.OnClickListener> data;
    private static LayoutInflater inflater = null;

    public ListAdapter(Context context, Map<String, View.OnClickListener> data) {
        this.context = context;
        this.data = data;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return data.keySet().toArray()[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = convertView;
        if (view == null)
            view = inflater.inflate(R.layout.list_item, null);

        TextView title = view.findViewById(R.id.item_title);
        title.setText((String) data.keySet().toArray()[position]);

        TextView menu = view.findViewById(R.id.item_menu);
        menu.setOnClickListener((View.OnClickListener) data.values().toArray()[position]);

        return view;

    }
}

Функция getView - это то место, где происходит magi c. Я устанавливаю текст для элемента списка и устанавливаю onClickListener для кнопки меню. Чтобы применить событие щелчка для каждого элемента, вы можете продолжить использование стандартной функции listView.setOnClickListener!

Вот XML для list_item. xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <include
        android:id="@+id/item_title"
        layout="@android:layout/simple_list_item_1" />

    <TextView
        android:id="@+id/item_menu"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentEnd="true"
        android:layout_marginEnd="10dp"
        android:layout_centerVertical="true"
        android:paddingHorizontal="10dp"
        android:text="&#8942;"
        android:textAppearance="@style/TextAppearance.AppCompat.Large" />

</RelativeLayout>

Чтобы применить вот код, который я использовал для тестирования (вы бы изменили слушателя, чтобы он отличался для каждого элемента):

View.OnClickListener listener = new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Toast.makeText(view.getContext(), "Menu Button", Toast.LENGTH_SHORT).show();
    }
};

Map<String, View.OnClickListener> map = new LinkedHashMap<>();
for (Playlist.Song song : songs)
    map.put(song.getText(), listener);

ListAdapter adapter = new ListAdapter(mainActivity, map);
listView.setAdapter(adapter);

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Song song = songs.get(position);
        // Play song
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...