Android 如何从实现ListAdapter的适配器刷新列表
我有一个实现ListAdapter的适配器 我在列表项上有一个按钮,当我点击该按钮时,该项将从数据中删除,从列表中删除该项后,我想刷新列表 notifyDataSetChanged()方法在ListAdapter中不可用 编辑:Android 如何从实现ListAdapter的适配器刷新列表,android,listadapter,Android,Listadapter,我有一个实现ListAdapter的适配器 我在列表项上有一个按钮,当我点击该按钮时,该项将从数据中删除,从列表中删除该项后,我想刷新列表 notifyDataSetChanged()方法在ListAdapter中不可用 编辑: public class ShoppingListAdapter implements ListAdapter { ArrayList<ProductInfoDTO> data; private LayoutInflater inflater = null
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;
}
}
公共类ShoppingListAdapter实现ListAdapter{
阵列列表数据;
专用充气机=空;
语境;
活动;
字符串标记=getClass().getSimpleName();
DBQuery-mDBQuery;
public ShoppingListAdapter(上下文、ArrayList数据){
this.context=上下文;
这个数据=数据;
活动=(活动)上下文;
充气器=((活动)上下文).getLayoutFlater();
mDBQuery=newdbquery(上下文);
}
@凌驾
public int getCount(){
返回data.size();
}
@凌驾
公共对象getItem(int位置){
返回数据。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
@凌驾
公共视图getView(最终int位置、视图转换视图、视图组父级){
MyCartItemView视图=空;
if(convertView==null){
视图=新的MyCartItemView(活动,数据.get(位置));
}否则{
视图=(MyCartItemView)convertView;
}
视图。设置位置(位置);
按钮删除;
delete=(按钮)view.findViewById(R.id.delete);
delete.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
Toast.makeText(上下文,“单击删除”,Toast.LENGTH\u SHORT)
.show();
//从数据库中删除
mDBQuery.DeleteCartData(data.get(position).cart\u id);
//从数据中删除
data.remove(data.get(position));
//现在我想刷新这里的列表
}
});
返回视图;
}
@凌驾
public int getViewTypeCount(){
返回data.size();
}
@凌驾
公共布尔表ID(){
返回false;
}
@凌驾
公共布尔值为空(){
返回false;
}
@凌驾
公共无效注册表DataSetObserver(DataSetObserver observer){
}
@凌驾
public void unregisteredDataSetobserver(DataSetObserver观察员){
}
@凌驾
公共布尔值areAllItemsEnabled(){
返回true;
}
@凌驾
公共布尔值isEnabled(整型位置){
返回true;
}
}
而不是使用ListAdapter
使用BaseAdapter
扩展适配器。然后您可以使用notifyDataSetChanged
编辑:
请参阅下文
尝试使用
public class ShoppingListAdapter extends BaseAdapter {
// add unimplemented methods...
}
而不是公共类ShoppingListAdapter实现ListAdapter{}
。如果有错误,请告诉我们错误说明。请尝试此代码
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
}
});
该特定方法调用DataSetObserver。您可以很容易地重新创建相同的方法。您应该参考BaseAdapter的源代码以查看ListAdapter接口的实现。你可以在这里找到它。您还应该在代码中包含一个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);}
真正的乐趣在于使它成为一个真正的可过滤的适配器,您应该查看ArrayAdapter的grepcode并查看所有涉及的内容。android最棒的地方之一就是开源。因此,当有疑问时,请阅读。变量是不言自明的,注释是一流的 您是否直接实现了ListAdapter?您应该扩展的子类之一。BaseAdapter附带了您正在寻找的notifyDataSetChanged()方法。如果没有代码,请看这里是否是您的案例@AlexBcn:在您所说的链接中,ScoreListAdapter扩展了ArrayAdapter,在我的案例中是implemetnsListAdapter@Jayesh另外,您还没有发布将适配器设置到活动列表中的代码!我面临着同样的问题,仍然在寻找解决办法。目前的答案只提供了使用ListAdapter
的替代方案,它们实际上并不能解决所问的问题。需要解决方案,而不是建议在swipelistview演示中,packageAdapter扩展了baseAdapter,工作正常。如果你需要解决方案,我们需要了解你的错误在哪里。没有任何错误,兄弟,你没有看到代码吗,我刚刚添加了一条注释//现在我想刷新这里的列表,我从github下载了swipeListView的演示代码,并实现了它ListAdapter@Neoh他还没有给出将适配器设置到列表中的代码,希望我们给出准确的答案!在该演示中有一个名为PackageAdapter的示例适配器类,如果您学习创建与该类类似的自己的类,则可以刷新该列表。除非像BaseAdapter一样实现所有功能,否则ListAdapter将无法刷新列表。但是为什么要重新发明轮子呢?在那一行显示错误,notifyDataSetChanged();方法不适用于ListAdapter…:(但我在适配器中没有ListView对象,它在Activity或Fragment中,在我的示例中ListView在Fragment中,通常我们喜欢ListView.setAdapter(customAdapter);来自Activity或Fragment,但我们在Adapter类中没有ListView对象。)