【问题标题】:Android - Listview delete item and RefreshAndroid - Listview 删除项目并刷新
【发布时间】:2011-01-11 10:56:37
【问题描述】:

我正在尝试使用删除功能实现 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();
     }

【问题讨论】:

  • 您使用的是哪种适配器?如果您使用 CursorAdapter,您所描述的应该可以工作。
  • Mods 不会删除问题,因为您对答案不满意,抱歉。

标签: android android-listview


【解决方案1】:

它会从您的列表适配器中删除它吗? 如果不是那将是notifyDataSetChanged() 对您没有多大好处的原因。

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

编辑(回答评论): 好吧,如果没有您的 ListView_CustomAdapter 课程,这很难做到。 问题是,在这个适配器中有一个数据集(你放在构造函数中的那个(listitemDisplay))也需要更新。只有这样notifyDataSetChanged() 才会起作用。

【讨论】:

  • 请告诉我一种实现删除功能的方法
  • 实际上我已经设计了自定义列表视图适配器,因此当我尝试访问适配器的“删除”方法时,它没有出现在弹出菜单中。
【解决方案2】:

使用 Intent 再次调用该 Activity

【讨论】:

  • 最后,我已经实现了与您提到的相同的功能。谢谢
  • 因此,如果您根据答案再次调用活动,每次删除项目时活动都会“向上滚动”,即使您向下滚动以删除底部的项目?
【解决方案3】:

我猜是使用

getActivity().recreate();

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

无论如何,它有效。

【讨论】:

    【解决方案4】:

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

    【讨论】:

      【解决方案5】:

      我在适配器中做了这样的事情:

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

      这会结束活动,然后再次开始相同的活动。

      【讨论】:

        【解决方案6】:
        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)
                        {
        
                        }
                } }); 
        

        这将刷新列表视图

        【讨论】:

          【解决方案7】:

          我有办法:

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

          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;
          }
          }
          

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              【解决方案9】:

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

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2017-08-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2015-10-18
                • 1970-01-01
                • 2012-06-22
                相关资源
                最近更新 更多