Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/214.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从实现ListAdapter的适配器刷新列表_Android_Listadapter - Fatal编程技术网

Android 如何从实现ListAdapter的适配器刷新列表

Android 如何从实现ListAdapter的适配器刷新列表,android,listadapter,Android,Listadapter,我有一个实现ListAdapter的适配器 我在列表项上有一个按钮,当我点击该按钮时,该项将从数据中删除,从列表中删除该项后,我想刷新列表 notifyDataSetChanged()方法在ListAdapter中不可用 编辑: public class ShoppingListAdapter implements ListAdapter { ArrayList<ProductInfoDTO> data; private LayoutInflater inflater = null

我有一个实现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;
}
}
公共类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对象。)