如何在状态发生变化时通知适配器?

时间:2017-02-21 06:18:45

标签: android android-fragments

在我的主要活动中,我有两个片段。一个是歌曲列表,第二个是收藏。这两个片段都包含ListView和自定义适配器。底部有一个按钮。当单击该按钮时,该歌曲将被添加到收藏夹(第二个片段)。我可以将歌曲添加到片段收藏夹中,但是当我们添加它时它不会显示。我们必须重新启动应用程序以使其成为最喜欢的。添加收藏夹的按钮是从主要活动开始操作的。有什么方法可以通知我的适配器状态已被更改。(添加到最喜欢的使用数据库的歌曲)

有什么办法可以在打开片段时刷新片段吗?

这是主要活动的代码,其中收藏夹是在点击时在数据库中添加歌曲名称的按钮。

favourite.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                if(x==0) {                         
  favourite.setImageResource(R.drawable.ic_favorite);x=1;
                    boolean isinserted =   
  mydb.insertdata(collections.get(a).getsong().toString());

                    if (isinserted == true) {
                        Toast.makeText(MainActivity.this, "Added as favorite", Toast.LENGTH_LONG).show();
                        x=1;
                    }
                    else
                    {
                        Toast.makeText(MainActivity.this, "data not inserted", Toast.LENGTH_LONG).show();
                    }

                }

                else{favourite.setImageResource(R.drawable.ic_favorite_border);
                    int deletedrow = mydb.deleteData(collections.get(a).getsong());
                    if(deletedrow>0){Toast.makeText(MainActivity.this, "removed from favorite", Toast.LENGTH_LONG).show();
                        finish();
                        startActivity(getIntent());

                        x=0;
                    }
                    else {Toast.makeText(MainActivity.this, " not removed from favorite", Toast.LENGTH_LONG).show();
                    }
                }

            }
        });

6 个答案:

答案 0 :(得分:0)

您应该从适配器中调用notifyDataSetChanged(),如下所示:

yourAdapter.notifyDataSetChanged();

答案 1 :(得分:0)

使用新添加的项目更新列表并调用

adapter.notifyDataSetChanged();

答案 2 :(得分:0)

将此项用于项目点击以添加到列表中:

    public Both[] boths;
public ArrayList<Both> both = new ArrayList<Both>();

onItemClick:

String itemValue = (String) listview.getItemAtPosition(i);
 if (boths == null) {
                boths = new Both[]{    \\Both is your Object Class name
                        new Both(itemValue)  
                };
            }
            both.addAll(Arrays.asList(boths));
            adapters.notifyDataSetChanged();   \\adapters is your Adapter Name 
            adapters.setAdapter(both); 

答案 3 :(得分:0)

据我所知,你有两个片段。这是一个解决方案如下:

第1步: 您可以定义两种方法来更新两个片段中的适配器!

SongFragment:

public void updateDataList(){
    if(songAdapter != null){
        songAdapter.notifyDataSetChanged();
    }
}

FavoriteFragment:

public void updateDataList(){
    if(favoriteAdapter != null){
        favoriteAdapter.notifyDataSetChanged();
    }
}

第2步:     当您想要更新视图时,您的MainActivity必须持有SongFragment和FavoriteFragment实例。     您可以在MainActivity中调用方法updateDataList。例如:

songFragment.updateDataList();
favoriteFragment.updateDataList();

答案 4 :(得分:0)

如果要从数据库中检索数据,还需要更新您的片段,您需要更新光标或列表,您可以使用此方法在片段上检查此片段,或者您可以使用侦听器来监听添加的fav事件。

 @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser) {

        }else{
            // fragment is no longer visible
        }
    }

答案 5 :(得分:0)

如果有人想要,我解决了。

点击按钮时我使用了广播。那个广播将以片段形式收到。在收件人中,我已清除列表,然后再次添加列表。现在,如果状态已更改,则会通知适配器