【问题标题】:Refresh ListView with BaseAdapter使用 BaseAdapter 刷新 ListView
【发布时间】:2015-01-30 16:18:50
【问题描述】:

我有一个 ListView,每个项目上都有一个删除按钮。我希望在按下按钮时将项目从数据中删除(HashMaps 的 ArrayList)并从 ListView 中解散。

这是我的代码:

基础适配器:

public class MyCustomAdapter extends BaseAdapter{

 private ArrayList<HashMap<String, Object>> list;

 private Context context;

 public MyCustomAdapter(ArrayList<HashMap<String, Object>> list,Context  context){

    this.list = list;
    this.context = context;
}


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

@Override
public Object getItem(int position) {
    return list.get(position);
}

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

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

    View view = convertView;

    if(view == null){

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        view = inflater.inflate(R.layout.addresslist_item, null);



        TextView address = (TextView) view.findViewById(R.id.listtxtaddress);

        String add = String.valueOf(list.get(position).get("address"));

        address.setText(add);

        Button btndelete = (Button) view.findViewById(R.id.listbtndelete);

        btndelete.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

                Log.d("check", "item_positiona:"+position);
                Log.d("check", "lista:"+list.toString());

                AlertDialog.Builder builder = new AlertDialog.Builder(context);

                builder.setTitle("Τιτλος επιχειρησησης");

                builder.setMessage("Θέλετε να διαγάρψετε αυτή τη διεύθυνση;");

                builder.setNegativeButton("NAI", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();

                        Log.d("check", "item_positionb:"+position);


                        list.remove(position);

                        notifyDataSetChanged();


                    }
                });

                builder.setPositiveButton("AKYPO", new DialogInterface.OnClickListener() {

                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        dialog.dismiss();

                    }
                });

                AlertDialog abc = builder.create();

                abc.show();



            }
        });


    }

    return view;


}
}

我的问题是该项目已从数据中删除,但是当 ListView 更新时,仅删除了最后一个项目,而不是我选择的项目。任何想法为什么会发生这种情况?提前致谢。

【问题讨论】:

    标签: android listview baseadapter


    【解决方案1】:

    ArrayList 更改后,您必须致电 notifyDataSetChanged() 以使用更改更新您的 ListView。这可以在适配器内部或外部完成。所以,例如:

    public class MyCustomBaseAdapter extends BaseAdapter {
        //TIP: Don't make this static, that's just a bad idea
        private ArrayList<Contact> searchArrayList;
    
        private LayoutInflater mInflater;
    
        public MyCustomBaseAdapter(Context context, ArrayList<Contact> initialResults) {
            searchArrayList = initialResults;
            mInflater = LayoutInflater.from(context);
        }
    
        public void updateResults(ArrayList<Contact> results) {
            searchArrayList = results;
            //Triggers the list update
            notifyDataSetChanged();
        }
    }
    

    【讨论】:

    • 我到底应该在哪里调用 updateResults 方法?
    • 这没有帮助,因为 OP 的问题不是更新列表视图,而是删除了错误的项目。
    【解决方案2】:

    修改数据后,在您的 Adapter 对象上调用 notifyDataSetChanged() 应该会刷新列表视图。

    你可以试试这个-

    在适配器内创建一个私有类 ViewHolder。此类应包含您的列表项拥有的所有视图。

    private static class ViewHolder {
        TextView address;
        String add;
        Button btndelete;
    }
    

    然后在 getView() 内部:

            ViewHolder viewHolder;
           if (convertView == null) {     
                    viewHolder = new ViewHolder();
                    LayoutInflater layoutInflater = LayoutInflater.from(mContext);
                    convertView = layoutInflater.inflate(R.layout.addresslist_item, null);
                    viewHolder.address =  (TextView) view.findViewById(R.id.listtxtaddress);
                    viewHolder.add = String.valueOf(list.get(position).get("address"));
                    viewHolder.address.setText(add);
    
                viewHolder.btndelete = (Button) view.findViewById(R.id.listbtndelete);
                    convertView.setTag(viewHolder);
        }
         else 
       {                
    
    
        viewHolder = (ViewHolder) convertView.getTag();
    
       } 
        viewHolder.btndelete.setOnClickListener(new View.OnClickListener() {
    
                    @Override
                    public void onClick(View v) {
    
                        Log.d("check", "item_positiona:"+position);
                        Log.d("check", "lista:"+list.toString());
    
                        AlertDialog.Builder builder = new AlertDialog.Builder(context);
    
                        builder.setTitle("Τιτλος επιχειρησησης");
    
                        builder.setMessage("Θέλετε να διαγάρψετε αυτή τη διεύθυνση;");
    
                        builder.setNegativeButton("NAI", new DialogInterface.OnClickListener() {
    
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
    
                                dialog.dismiss();
    
                                Log.d("check", "item_positionb:"+position);
    
    
                                list.remove(position);
    
                                notifyDataSetChanged();
    
    
                            }
                        });
    
    
    
    
        builder.setPositiveButton("AKYPO", new DialogInterface.OnClickListener() {
    
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
    
                            dialog.dismiss();
    
    
    
                        }
                    });
    
                    AlertDialog abc = builder.create();
    
                    abc.show();
    
    
    
                }
            });
    
    
        }
        }
        return convertView;
        }
    

    【讨论】:

    • 对不起,它没有用。删除最后一项的结果相同。看起来只减少了 list.size() 但保留了相同的数据。
    • @user3734693 问题可能是列表已更新,但更新后的列表没有出现。由于列表的大小减少了一个,它只会隐藏列表的最后一项,你会看到最后一项被删除。如果在删除项目后你回到上一个片段/活动,然后返回到列表片段/活动,你应该看到正确的项目被删除。尝试用 list.getAdapter() 调用替换所有适配器调用。跨度>
    • 我尝试了所有方法,但结果相同!我还添加了活动,看看那里是否有问题......谢谢!
    • 我已经为这个问题添加了新的答案..请尝试一下..它易于实施,如果您发现任何问题,请告诉我
    【解决方案3】:

    你也可以试试这个方法。。 创建监听接口

    package xyz.listeners;
    
    public interface DeleteClickListener {
    
        public void onDeleteClick(int position);
    
    }
    

    比在您的具有列表视图的活动/片段中-

    private DeleteClickListener mDeleteClickListener;
    mDeleteClickListener = new DeleteClickListener() {
    
                @Override
                public void onDeleteClick(int position) {
    
         list.remove(position);
    adapter.notifyDataSetChanged();
                }
            };
    

    在您的适配器类构造器中传递该侦听器。

    public MyCustomAdapter(ArrayList<HashMap<String, Object>> list,Context  context,DeleteClickListene mDeleteClickListener){
    
        this.list = list;
        this.context = context;
        deleteClickListener=mDeleteClickListener;
    
    }
    

    然后单击删除按钮

    builder.setNegativeButton("NAI", new DialogInterface.OnClickListener() {
    
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
    
                                  deleteClickListener.onDeleteClick(position);
    
    
    
    
                                }
                            });
    

    【讨论】:

    • 刚刚在上面的代码中做了一些更正..try tht
    猜你喜欢
    • 2016-04-18
    • 2012-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 2013-11-23
    相关资源
    最近更新 更多