2017-02-21 62 views
-1

在我的主要活动中,我有两个片段。一个是歌曲列表,第二个是最喜欢的。这两个片段都包含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(); 
        } 
       } 

      } 
     }); 
+0

您是否为该最喜欢片段中列表的底层适配器调用了'notifyDataSetChanged'? –

+0

是的,但没有任何反应。因为该按钮是在主要活动 –

+1

你应该提供一个mcve,http://stackoverflow.com/help/mcve –

回答

0

你应该打电话notifyDataSetChanged()从您的适配器是这样的:

yourAdapter.notifyDataSetChanged(); 
0

更新与新添加的项目名单,并呼吁

adapter.notifyDataSetChanged(); 
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); 
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(); 
+0

只有当您的数据列表必须在您的适配器中更改时,它才能工作! – Ethan

0

您还需要更新您的片段,如果你是从数据库中检索数据,你需要更新你的光标或列表中,您可以在片段中此方法来检查,或者你可以让听众在那里你可以听你添加的收藏活动。

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

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

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

当按钮被点击时,我使用了广播。然后那个广播将被接收在片段中。在收件人我清除了列表,然后再次添加列表。现在通知适配器状态是否已更改