2013-06-27 50 views
1

刷新列表我有一個實現ListAdapter一個適配器,如何從適配器用於實現ListAdapter

我對清單項目一個一個按鈕,當我點擊該按鈕,該項目是從數據中刪除,刪除該項目從列表後,我要刷新列表,

notifyDataSetChanged()方法不可用在ListAdapter

編輯:

public class ShoppingListAdapter implements ListAdapter { 

ArrayList<ProductInfoDTO> data; 
private LayoutInflater inflater = null; 
Context context; 
Activity activity; 
String TAG = getClass().getSimpleName(); 

DBQuery mDBQuery; 

public ShoppingListAdapter(Context context, ArrayList<ProductInfoDTO> data) { 

    this.context = context; 
    this.data = data; 
    activity = (Activity) context; 
    inflater = ((Activity) context).getLayoutInflater(); 

    mDBQuery = new DBQuery(context); 
} 

@Override 
public int getCount() { 
    return data.size(); 
} 

@Override 
public Object getItem(int position) { 

    return data.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    MyCartItemView view = null; 

    if (convertView == null) { 
     view = new MyCartItemView(activity, data.get(position)); 
    } else { 
     view = (MyCartItemView) convertView; 
    } 
    view.setPosition(position); 

    Button delete; 

    delete = (Button) view.findViewById(R.id.delete); 

    delete.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Toast.makeText(context, "delete clicked", Toast.LENGTH_SHORT) 
        .show(); 

      // delete from database 
      mDBQuery.DeleteCartData(data.get(position).cart_id); 

      // delete from data 
      data.remove(data.get(position)); 

      // now I want to refresh the list here        

     } 
    }); 


    return view; 
} 

@Override 
public int getViewTypeCount() { 
    return data.size(); 
} 

@Override 
public boolean hasStableIds() { 
    return false; 
} 

@Override 
public boolean isEmpty() { 
    return false; 
} 

@Override 
public void registerDataSetObserver(DataSetObserver observer) { 

} 

@Override 
public void unregisterDataSetObserver(DataSetObserver observer) { 

} 

@Override 
public boolean areAllItemsEnabled() { 
    return true; 
} 

@Override 
public boolean isEnabled(int position) { 
    return true; 
} 
} 
+1

你是否直接實現了ListAdapter?您應該擴展其中一個[BaseAdapter](http://developer.android.com/reference/android/widget/BaseAdapter.html)的子類。 BaseAdapter附帶您正在查找的notifyDataSetChanged()方法。 – devconsole

+0

沒有代碼...在這裏看看,如果它是你的情況http://stackoverflow.com/questions/14859766/how-do-i-get-notifydatasetchanged-to-work-with-a-listadapter – AlexBcn

+0

@AlexBcn:在你正在討論的鏈接中,ScoreListAdapter擴展了ArrayAdapter ,並且在我的情況下實現了ListAdapter – Jayesh

回答

0

嘗試使用

public class ShoppingListAdapter extends BaseAdapter { 
    // add unimplemented methods... 
} 

,而不是public class ShoppingListAdapter implements ListAdapter{}。如果出現錯誤,請告訴我們錯誤在說什麼。

+0

需要一個解決方案,而不是sugessstion – Jayesh

+0

在swipelistview演示中,packageAdapter擴展了baseAdapter並且工作得很好。如果您需要解決方案,我們需要了解您的錯誤在哪裏。 – Neoh

+0

沒有任何錯誤的地方兄弟,你有沒有看過代碼,我只是添加一條評論//現在我想刷新這裏的列表 我下載了github的swipeListView的演示代碼,他們實現了ListAdapter – Jayesh

0

試試這個代碼..

delete.setOnClickListener(new View.OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     Toast.makeText(context, "delete clicked", Toast.LENGTH_SHORT) 
       .show(); 

     // delete from database 
     mDBQuery.DeleteCartData(data.get(position).cart_id); 

     // delete from data 
     data.remove(data.get(position)); 

    your_listview.invalidateViews(); //refresh the list here        

    } 
}); 
+0

顯示錯誤在那一行,notifyDataSetChanged();方法不適用於ListAdapter .... :( – Jayesh

+0

請檢查上面的代碼.. –

+0

但我沒有在Adapter中的ListView對象,它在Activity或Fragment中,在我的情況下ListView在片段中,通常我們喜歡這個listview .setAdapter(customAdapter);來自activity或fragment,但我們沒有在Adapter類中的listview對象 – Jayesh

0

這個特定的方法調用DataSetObserver。您可以非常輕鬆地重新創建相同的方法。您應該引用BaseAdapter的源代碼以查看ListAdapter接口的實現。你可以在這裏找到grepcode。你還應該在你的代碼中包含一個add(object)方法,以使其更具響應性和可重用性。

實施DataSetObserver

public class YourClass extends Something implements ListAdapter{ 
    private final DataSetObservable mObservable = new DataSetObservable(); 
    @Override 
    public void registerDataSetObserver(DataSetObserver observer) { 
     mObservable.registerObserver(observer); 
    } 

    @Override 
    public void unregisterDataSetObserver(DataSetObserver observer) { 
     mObservable.unregisterObserver(observer); 
    } 
    public void notifyDataSetChanged(){ 
     mObservable.notifyChanged(); 
    } 
    public void notifyDataSetInvalidated(){ 
     mObservable.notifyInvalidated(); 
    } 

添加Add方法

public void add(YourDataType object){ data.add(object);} 

真正的樂趣開始使它成爲一個真正的適配器,過濾,你應該看看grepcode的ArrayAdapter看到,涉及的一切。關於android的最好的事情之一就是開源。所以如有疑問請閱讀。這些變量是自我解釋的,註釋是一流的。