更新 ArrayList 适配器

Posted

技术标签:

【中文标题】更新 ArrayList 适配器【英文标题】:Updating ArrayList Adapter 【发布时间】:2021-04-25 04:48:40 【问题描述】:

我觉得我咬的有点多,我不能咀嚼。我正在创建一个虚拟音乐播放器,我想添加一个按钮,用户可以将 Song() 对象添加到 ArrayList。问题是我在 onCreate() 方法中将 Song 对象添加到 Array 中。我有一个膨胀 PopUpView 的按钮,在该视图中我有另一个按钮,它从编辑字段中获取 getText() 并将一个项目添加到 ArrayList,当点击“完成”按钮时,PopUPView 被关闭并且新歌曲() 出现在歌曲列表中,但是当我返回主菜单然后返回歌曲列表时,用户添加的新对象不再存在。

public class AllSongsActivity<name> extends AppCompatActivity 

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

private AlertDialog.Builder dialogBuilder;
private AlertDialog dialog;
private EditText songNameEditText;
private EditText artistNameEditText;
private EditText genreNameEditText;
private CheckBox isFavoriteCheckBox;

@Override
protected void onCreate(Bundle savedInstanceState) 
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_all_songs);

    ListView listView = (ListView) findViewById(R.id.list);
    //Create List Of Song
    songs.add(new Song("Fever", "Dua Lipa", "POP", true));
    songs.add(new Song("Lonely", "Justin Bieber", "POP", false));
    songs.add(new Song("Courage To Change", "Sia", "POP", true));
    songs.add(new Song("Monster", "Shawn Mendes", "POP", false));
    songs.add(new Song("Dance Monkey", "Tones And I", "POP", true));
    songs.add(new Song("Masterpeice", "DaBaby", "RAP", false));
    songs.add(new Song("Wolves", "Big Sean", "RAP", false));
    songs.add(new Song("Trust", "Fivo Foreign", "RAP", false));
    songs.add(new Song("Back", "Jeezy", "RAP", false));
    songs.add(new Song("Bad Boy", "Juice Wrld", "RAP", true));
    songs.add(new Song("Deeper", "DubVision", "EDM", true));
    songs.add(new Song("Sick Of You", "Jerome", "EDM", true));
    songs.add(new Song("Paul Is Dead", "Scooter", "EDM", true));
    songs.add(new Song("All I Need", "Slushii", "EDM", true));
    songs.add(new Song("Willow", "Taylor Swift", "POP", false));

    ListAdapter songAdapter = new SongAdapter(this, songs);
    listView.setAdapter(songAdapter);

    Button addSongButton = (Button) findViewById(R.id.add_song_button);
    addSongButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            popUpWindow();
        
    );



public void popUpWindow() 
    dialogBuilder = new AlertDialog.Builder(this);
    final View addNewSongView = getLayoutInflater().inflate(R.layout.add_song_popup_window, null);
    dialogBuilder.setView(addNewSongView);
    dialog = dialogBuilder.create();
    int sizeOfArray = songs.size();
    System.out.println("This is the size of the array before songs added" + sizeOfArray);
    dialog.show();

    Button addNewSongButton = (Button)dialog.findViewById(R.id.done_button);
    addNewSongButton.setOnClickListener(new View.OnClickListener() 
        @Override
        public void onClick(View v) 
            songNameEditText = (EditText)dialog.findViewById(R.id.song_name_edit_text);
            artistNameEditText = (EditText)dialog.findViewById(R.id.arist_name_edit_text);
            genreNameEditText = (EditText)dialog.findViewById(R.id.genre_edit_text);
            isFavoriteCheckBox = (CheckBox)dialog.findViewById(R.id.favorite_checkbox);
            int songsSize = songs.size();

            String songName = songNameEditText.getText().toString();
            String artistName = artistNameEditText.getText().toString();
            String genreName = genreNameEditText.getText().toString();
            Boolean isFavorite = isFavoriteCheckBox.isSelected();

            if (songName.matches("") || artistName.matches("") || genreName.matches("")) 
                Toast.makeText(AllSongsActivity.this, "Please Fillout All Fields",Toast.LENGTH_SHORT).show();
            else 
                    Song newObject = new Song(songName, artistName, genreName, isFavorite);
                    songs.add(newObject);
                    dialog.dismiss();
            
        
    );

我已经学习了几个月的 android 开发,所以我知道我的代码真的很乱,而且没有使用最好的技术。

【问题讨论】:

也许,您每次从主菜单进入时都会创建一个AllSongsActivity 的新实例,然后songs 列表被初始化为空ArrayListonCreate() 被称为含义您将只有您在 onCreate() 方法中添加的歌曲。 有没有更好的地方来初始化ArrayList?我觉得应该有一种方法可以将它初始化为全局变量并引用它,就像我说我是 Android Dev 的新手,但我觉得这对于使用 Swift 的 ios 应用程序来说非常容易。跨度> 不,我认为您需要初始化对象AllSongsActivity 的变量并保留对它的引用,因为它可以让您存储更改。你知道我的意思吗? 【参考方案1】:

代码中的问题:songs 列表是 AllSongsActivity 的一个属性。如果您关闭 AllSongsActivity - 来自活动和 歌曲 列表的所有数据都会消失!

保存新歌曲的简单但不正确的方法是使用 songsstatic 修饰符: static ArrayList&lt;Song&gt; songs = new ArrayList&lt;String&gt;() add(new Song("Fever", "Dua Lipa", "POP", true)); add(new Song("Lonely", "Justin Bieber", "POP", false)); ;

正确的方法——学习如何在数据库中存储数据:https://developer.android.com/training/data-storage/room

【讨论】:

好的,所以我将 ArrayList 从 onCreate() 中移出,并初始化了您建议应用程序在活动打开时崩溃的方式。我又进行了几次搜索,偶然发现了一篇 *** 帖子,说要将初始化移动到静态块中。现在效果很好!!非常感谢您为我指明了正确的方向!

以上是关于更新 ArrayList 适配器的主要内容,如果未能解决你的问题,请参考以下文章

更改数组列表时,带有 ArrayList 和 ListView 的 Android 数组适配器不会更新

从片段更新ListView适配器内的TextView

如何更新 RecyclerView 适配器数据

使用适配器动态更新列表视图

使用适配器中的不同数据更新不同 ListView 中的常见帖子

ArrayAdapter 未使用 notifyDataSetChanged() 进行更新