【问题标题】:Android: How to pass Data from an Adapter to the Main Activity from a OnClickListenerAndroid:如何将数据从适配器传递到 OnClickListener 的主活动
【发布时间】:2016-12-20 19:14:05
【问题描述】:

我真的被困在这里,我是编程新手。 我在我的音乐应用程序中取得了很多成就,但现在我在我的 listViewAdapter 中使用 OnClickListener 制作了一个按钮,我想在我的 MainActivity 中的 favList ArrayList 中添加一首歌曲。有了这个代码,我就有了我想要的歌曲,但我如何将它放入列表中?

这是我的代码:

class SongAdapter extends ArrayAdapter<Song> {

    SongAdapter(Context context, ArrayList<Song> songs) {
        super(context, 0, songs);
    }

    @NonNull
    @Override
    public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
        // Check if the existing view is being reused, otherwise inflate the view
        View listItemView = convertView;
        if (listItemView == null) {
            listItemView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
        }
        Song currentSong = getItem(position);

        TextView songNameTextView = (TextView) listItemView.findViewById(R.id.song_name);
        assert currentSong != null;
        songNameTextView.setText(currentSong.getSongName());
        TextView songArtistTextView = (TextView) listItemView.findViewById(R.id.song_artist);
        songArtistTextView.setText(currentSong.getArtist());

        ImageButton addToPlaylistButton = (ImageButton) listItemView.findViewById(R.id.addToPlaylist);
        addToPlaylistButton.setTag(position);
        addToPlaylistButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                int position = (Integer) view.getTag();
                Song song = getItem(position);
                Toast.makeText(view.getContext(), song.getAlbum().toString(), Toast.LENGTH_LONG).show();
            }
        });

        return listItemView;
    } }

以下是我的 MainActivity 中的部分:

final ArrayList<Song> songs = new ArrayList<>();  final ArrayList<Song> favSongs = new ArrayList<>();

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.song_list);
         //Setup the Listview for the Songs
            SongAdapter adapter = new SongAdapter(this, songs);
            ListView listView = (ListView) findViewById(R.id.list);
            listView.setItemsCanFocus(true);
            listView.setAdapter(adapter); 
            }

【问题讨论】:

    标签: android adapter onclicklistener


    【解决方案1】:

    您应该在活动中创建自己的 OnItemClickListener,将其设置为适配器,然后将带有位置的 onClick 事件发送到该自定义侦听器。

    interface OnItemClickListener {
        void onItemClicked(int position);
    }
    

    活动中:

    private OnItemClickListener listener = new OnItemClickListener() {
        public void onItemClicked(int position) {
            Song song = adapter.get(position);
            //do whatever you want with song
        }
    }
    
    //creation of adapter
    SongAdapter adapter = new SongAdapter(this, songs, listener);
    

    在适配器中:

    private OnItemClickListener onClickListener;
    
    SongAdapter(Context context, ArrayList<Song> songs, OnItemClickListener onClickListener) {
        super(context, 0, songs);
        this.onClickListener = onClickListener;
    }
    
    //in getView
    addToPlaylistButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (onClickListener != null) {
                    onClickListener.onItemClicked(position);
                }
            }
        });
    

    【讨论】:

    • 非常感谢,我实现了您的代码并解决了我遇到的所有错误,现在它确实有效。我还有一个问题,我从来没有在界面上使用过你的第一个代码块,那会做什么?我应该在这里为其他人发布我的完整解决方案代码吗?这是我的第一个问题。
    • @Tyrone3 在这里阅读:What is interface。很快它就是一个契约,应该实现哪个类。类可以实现许多合同。在活动中,我创建了该接口的匿名实例。如果我的回答符合您的所有需求,您不应该发布完整的解决方案。尽量让您的问题/答案不那么具体,并适用于广大受众。
    【解决方案2】:

    您可以只使用在创建适配器时传递给适配器的songs 的引用。像这样的:

    class SongAdapter extends ArrayAdapter<Song> {
    
        private ArrayList<song> songs;
    
        SongAdapter(Context context, ArrayList<Song> songs) {
            this.songs = songs
            super(context, 0, songs);
        }
    
        (snip...)
    
            @Override
            public void onClick(View view) {
                int position = (Integer) view.getTag();
                Song song = getItem(position);
    
                songs.add(song);
                (...)
            }
        }); // end of listener
    
    }
    }
    

    您的 ArrayList 现在将包含您的 Song

    另一种更简单的方法是在主 Activity static 中创建 ArrayList,这样您就可以从任何地方引用它,但是,不建议在 Android 上这样做。

    【讨论】:

    • 感谢您的代码,我从未尝试过您的代码,因为我得到了上面的代码。你也错过了一个事实,我想从 Song ArrayList 中取出一首歌,但我想在之后把它从 MainActivity 放到 favList 中。
    猜你喜欢
    • 1970-01-01
    • 2019-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多