2017-02-21 94 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

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

當按鈕被點擊時,我使用了廣播。然後那個廣播將被接收在片段中。在收件人我清除了列表,然後再次添加列表。現在通知適配器狀態是否已更改