2013-05-21 116 views
1

在android中我有一個自定義適配器,在這個自定義適配器中,我創建了一個視圖,其中包含一些文本和一個按鈕以刪除文本。所有這些工作正常,我可以從數據庫中刪除記錄,但我一直無法刷新列表。從光標適配器的ListFragment內更新列表視圖

列表看起來有點像這樣:

------------------------------------ 
text text text text | Delete Button| 
------------------------------------ 
text text text text | Delete Button| 
------------------------------------ 

我的第一反應是用這樣的:

QCListFragment frag = (QCListFragment) getSupportFragmentManager().findFragmentById(R.id.listFragment); 

在什麼時候我可以打電話給我的名單片段裏面的方法重新 - 查詢列表... 但我不能這樣做,因爲我的適配器不擴展片段。所以我發現很難讓片段知道數據已經改變。

無論如何,我最後的想法只是重建活動,但我認爲這可能不是最好的事情,並且必須有更好的方法......我確信這是簡單的,我我錯過了最後一個問題!

(我可以發佈更多的代碼,如果這將是有益的) 更新: 這裏我的整個適配器類

公共類CalcCursorAdapter擴展SimpleCursorAdapter實現的可篩選{

private Context mContext; 
private ListView mListView; 
private int mLayout; 
private Cursor mcursor; 

protected static class ViewHolder { 
    protected TextView text; 
    protected ImageButton button; 
    private int position; 
    } 


@SuppressWarnings("deprecation") 
public CalcCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to) 
{ 
    super(context, layout, c, from, to); 
    this.mContext = context; 
    this.mLayout = layout; 
    this.mcursor = c; 

    //mListView = .getListView(); 

}  

@Override 
public void bindView(View view, Context context, Cursor cursor) { 
    TextView summary = (TextView)view.findViewById(R.id.calctvPrice); 
    TextView savings = (TextView)view.findViewById(R.id.calctvSavings); 
    summary.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcFinalPrice"))); 
    savings.setText(cursor.getString(cursor.getColumnIndexOrThrow("qcSavings"))); 



} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    ViewHolder holder = new ViewHolder(); 

    LayoutInflater inflater = LayoutInflater.from(context); 
    View v = inflater.inflate(R.layout.calc_list_item, parent, false); 

    holder.button = (ImageButton) v.findViewById(R.id.qcbtnDelete); 
    holder.button.setOnClickListener(deleteButton); 
    holder.position = cursor.getInt(cursor.getColumnIndexOrThrow("_id")); 
    bindView(v, context, cursor); 
    v.setTag(holder); 


    return v; 

} 

private OnClickListener deleteButton = new OnClickListener() { 
    public void onClick(View v){ 
     View view = (View) v.getParent(); 
     ViewHolder holder = (ViewHolder) view.getTag(); 
     int position = holder.position; 
     DbHelper mDbHelper; 
     mDbHelper = new DbHelper(mContext); 
     mDbHelper.open(); 
     mDbHelper.deleteCalc(position); 
     mDbHelper.close(); 
     String test = Integer.toString(position); 
     Toast.makeText(mContext.getApplicationContext(), test, Toast.LENGTH_SHORT).show(); 
     notifyDataSetChanged(); 

    } 
}; 


public long qcItemId(int position) { 

    return position; 
} 

}

任何非常感謝幫助!

謝謝。

+0

你試過notifyDatasetChanged()方法嗎? – Varundroid

+0

該片段不處理點擊,適配器,這是因爲被點擊的按鈕是在列表中。並意味着(至少據我所知)我不能調用adapter.notifyDatasetChanged(),因爲我在適配器內... – Klaven

+0

看看我的答案,讓我知道如果你現在可以打電話notifyDatasetChanged()方法。我們會盡力幫助你。 – Varundroid

回答

0

我想你誤解了Adapter和Fragment的概念。您可以在Fragment中將Adapter設置爲Fragment或AdapterView。查詢數據後,調用Adapter.notifyDataSetChanged(),然後刷新Fragment或AdapterView。

+0

我的適配器內沒有適配器對象...所以我不知道如何執行所述操作。我的onclick監聽器位於適配器內部,因爲它是每行中的一個按鈕。 – Klaven

+0

你不需要適配器內的Adapter對象,只需調用notifyDataSetChanged()。 – Varundroid

+0

我在OnClickListener內部的適配器中調用了notifyDataSetChanged(),它不會執行任何操作。我上面發佈了我的代碼。 – Klaven

0

當您位於適配器內時,您可以直接撥打notifyDatasetChanged()。您不需要適配器的對象。我認爲你需要刷新你的OOPS概念。你的適配器擴展了BaseAdapter或ArrayAdapter或SimpleAdapter,它們都有這個方法,你不需要類本身的對象來調用它自己的方法。

編輯

notifyDataSetChanged()因爲你是膨脹的觀點,每次,這是不是在性能方面的好事沒爲你工作。看看這Answer。在notifyDataSetChanged()之後onContentChanged()被調用。我不確定這是如何爲你工作的。我強烈建議你使用notifyDataSetChanged()來使事情發揮作用,不要爲了解決問題而努力。