2014-07-09 31 views
3

我正在處理包含listview的片段(此片段是創建活動時生成的PlaceHolderFragment)。我擴展了ArrayAdapter來製作自定義適配器,並使用此適配器填充我的列表視圖。如何從ArrayAdapter中的onClickListener重新加載活動

一個重要的是在一行listview中,有2個按鈕:第一個是啓用/禁用按鈕來改變用戶的狀態(當用戶的狀態是活動的,然後禁用,否則啓用),第二個是刪除按鈕(刪除用戶)。因此,我必須在適配器的方法getView()中爲此2個按鈕實現OnClickListener。

當單擊其中一個按鈕時,它將向服務器發送請求並操作數據庫(更改用戶狀態或從數據庫中刪除用戶)。當我點擊啓用按鈕(例如),它是成功和數據庫中用戶的狀態改變,或者當我點擊刪除按鈕,用戶將成功從數據庫刪除

但我點擊那個按鈕後,它是狀態不會改變(我的意思是如果用戶被啓用,現在該按鈕必須改變爲禁用,或者如果用戶被刪除,該行必須從屏幕上移除)。我不得不手動重新加載這個片段(切換到其他片段,然後回來)

問題是我該如何重新加載活動(我已經實現onResume加載所有數據到適配器,所以如果我可以使這個方法onResume的片段運行,它會按我的期望工作),或者至少我如何重新加載列表視圖來更新新的數據?

:notifyDataSetChanged()不起作用,因爲在適配器中的數據實際上沒有改變的是,只有在服務器上的數據被更改

注2:如果你需要我後我的代碼,請評論,我會編輯我的帖子,因爲我認爲我的代碼很長

謝謝,最好的問候!

編輯1 我已爲我的回答下面的解決方案,它解決了問題,但我不得不說,這是在Android中一個非常非常BAD實踐。例如,當您想要使用此方法刪除某個項目時,可能需要爲用戶確認一個AlertDialog,但AlertDialog只能顯示在Activity(或Fragment)中,無法從Adapter中顯示。相反,您應該使用一些不同的方法,如ContextMenu或CustomDialog。

+0

你能分享一下你試過的代碼嗎? – MTahir

+0

@MTahir:謝謝你看看我的問題,但現在我終於找到了我在 –

回答

3

經過幾個星期的搜索谷歌和嘗試不同的方法,我終於找到了一種方法來存檔我想要的,它非常簡單。我在這裏發佈我的答案的人在未來

public class CustomAdapter extends ArrayAdapter<YourClass> { 
    private List<YourClass> items; 
    private CustomAdapter adapter; 
    private Context context; 
    private Button button; 
    private YourClass item; 

    public CustomAdapter(Context context, List<YourClass> items) { 
     super(context, R.layout.custom_list_item, items); 
     this.items = items; 
     this.context = context; 
     this.adapter = this; //This is an important line, you need this line to keep track the adapter variable 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 

     if (v == null) { 
      LayoutInflater li = LayoutInflater.from(getContext()); 
      v = li.inflate(R.layout.custom_list_item, null); 
     } 
     item = items.get(position); 

     button = (Button) v.findViewById(R.id.button); //Find the button 
     button.setOnClickListener(new OnClickListener() { 

        @Override 
        public void onClick(View view) { 
         //Do something inside here like update, remove your item... 
         //But the important is 
         items.remove(item); //Actually change your list of items here 
         adapter.notifyDataSetChanged(); //notify for change 
        } 
       }); 
    } 
    return v; 
} 

就是這樣,面對這個問題,像我這樣,你需要實現時,你需要在列表視圖中,你需要實現轉接器內的OnClick情況下重裝。希望你的傢伙在遇到這個問題時比我容易找到

+0

以下發布的答案爲什麼不直接使用'this.notifyDataSetChanged();'? – Rule

+0

@規則:如果您刪除此行items.remove(item),則適配器中的數據實際上不會更改;然後調用adapter.notifyDataSetChanged();什麼也沒做 –

+0

它對我來說是完美的(如果有人放棄這個,首先閱讀代碼中的註釋) – Bahu

0

我從你的問題中瞭解到,如果你想刷新列表數據,當你點擊一個按鈕時,你需要。
現在您應該調用notifydataset更改,而不是重新加載活動。 爲此,您需要更改yu用於適配器的數組(不要更改數組對象,只是數組的項目) like arraylst.get(index).activ = true等等,然後調用notifiydataset更改。

相關問題