Android - Listview删除项目和刷新

时间:2011-01-11 10:56:37

标签: android android-listview

我正在尝试使用Delete功能实现ListView以从列表视图中删除项目。我成功删除但在删除数据库中的项目后无法刷新列表视图。

实际上,点击listitem,我显示AlertBox为“删除”和“取消”操作,点击“删除”,项目应该从数据库中删除,以及从列表视图和列表视图中删除应该刷新。我还使用了notifyDataSetChanged()方法。

lview = (ListView) findViewById(R.id.lview);
adapter = new ListView_CustomAdapter(this, listitemDisplay);
lview.setAdapter(adapter);

lview.setOnItemClickListener(new OnItemClickListener() 
{
     @Override
     public void onItemClick(AdapterView<?> a, View v, int position, long id)
     {
        Show_Alert_box(v.getContext(),"Please select action.",position);
     }
});

以及Show_Alert_box的代码:

 public void Show_Alert_box(Context context, String message,int position)
     {
         final int pos = position;

         final AlertDialog alertDialog = new  AlertDialog.Builder(context).create();
            alertDialog.setTitle(getString(R.string.app_name_for_alert_Dialog));
            alertDialog.setButton("Delete", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {

                    try
                    {
                        db.open();
                                 String[] whereArgs={String.valueOf(pkID)};
        return db.delete(DATABASE_TABLE_4,"pk_pkID == ?",whereArgs);    
                        adapter.notifyDataSetChanged();
                        db.close();
                    }
                    catch(Exception e)
                    {

                    }
            } }); 
            alertDialog.setButton2("Cancel", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                    alertDialog.dismiss();
            } }); 

            alertDialog.setMessage(message);
            alertDialog.show();
     }

9 个答案:

答案 0 :(得分:11)

是否会从列表适配器中删除它? 如果不是这就是notifyDataSetChanged()对你没有好处的原因。

实际上再次查看你的代码我只能发现你是从数据库中删除它而不是适配器本身。

编辑(回答评论): 没有你的ListView_CustomAdapter课程,这很难做到。 问题是,在这个适配器中有一个数据集(你在构造函数中放置的那个(listitemDisplay)),它也需要更新。只有这样notifyDataSetChanged()才能正常工作。

答案 1 :(得分:9)

再次使用Intent

调用该Activity

答案 2 :(得分:6)

我猜是使用

getActivity().recreate();

而不是通过新的Intent重新启动活动更好,因为使用新的Intent只会停止当前活动而不会销毁它。

无论如何,它有效。

答案 3 :(得分:5)

如果你有光标,在调用notifyDataChanged()

之前调用requery()

答案 4 :(得分:4)

我在我的适配器中做了类似的事情:

((Activity)cxt).finish();
Intent intent = new Intent(cxt, YourActivity.class);
cxt.startActivity(intent);

这将结束活动,然后再次启动相同的活动。

答案 5 :(得分:3)

我认为不是再次调用活动,而是在从数据库获取更新数据并将这样放入listitemDisplay列表后,将适配器设置为alertBox删除选项上的listview。

alertDialog.setButton("Delete", new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int which) {
                try
                {
                    db.open();
                             String[] whereArgs={String.valueOf(pkID)};
                    return db.delete(DATABASE_TABLE_4,"pk_pkID == ?",whereArgs); 
                    listitemDisplay = db.getItemFromDB();
                    adapter = new ListView_CustomAdapter(this, listitemDisplay);
                    lview.setAdapter(adapter);
                    db.close();
                }
                catch(Exception e)
                {

                }
        } }); 

这将刷新listView

答案 6 :(得分:3)

我有解决方案:

如果要从列表视图中删除行,请单击每行的DELETE按钮执行此操作。这里有一个带有名称和删除按钮的自定义适配器类的示例。每次按下该按钮都会删除该行

public class UserCustomAdapter extends ArrayAdapter<User>{ 

Context context;
int layoutResourceId;
ArrayList<User> data = new ArrayList<User>();

public UserCustomAdapter(Context context, int layoutResourceId,ArrayList<User> data) {
    super(context, layoutResourceId, data);
    this.layoutResourceId = layoutResourceId;
    this.context = context;
    this.data = data;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    View row = convertView;
    UserHolder holder = null;


    if (row == null) {
        LayoutInflater inflater = ((Activity) context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent, false);

        holder = new UserHolder();
        holder.textName = (TextView) row.findViewById(R.id.textView1);
        holder.btnDelete = (Button) row.findViewById(R.id.button2);
        row.setTag(holder);
    } else {
        holder = (UserHolder) row.getTag();

    }

    User user = data.get(position);


    holder.btnDelete.setTag(position);
    holder.textName.setText(user.getName());



    holder.btnDelete.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            String pos = v.getTag().toString();
            int _posicion = Integer.parseInt(pos);
            data.remove(_posicion);
            notifyDataSetChanged();

        }
    });

    return row;


}

static class UserHolder {
    TextView textName;
    Button btnDelete;
}
}

答案 7 :(得分:0)

尝试调用refreshDrawableState告诉列表重绘。

答案 8 :(得分:0)

在onCreate块之外创建一个新函数{类似于... getdata()}并在插入内部获取所有数据并设置为适配器。
然后在onResume()块中再次调用该函数。因此,无论何时您从列表中删除数据,它都会立即反映出来。