2017-07-07 150 views
0

我已经在我的应用程序中实现了一个快捷栏,它有一个撤消按钮来撤消删除。目前它的工作原理是,当用户删除一个项目时,通过从数据库执行查询来保持光标与该项目相同,然后将该项目从数据库中删除,并通过notifyChange()更新列表。当用户点击快餐栏上的撤消按钮时,我从已保存的游标中提取内容,创建一个新的ContentValue并将其插入到数据库中,再次调用notifyChange()来更新列表。
我不喜欢这种方法。有太多的数据库操作。
有没有什么办法可以从ListView中删除/隐藏一个项目,并且只在快餐栏消失时才删除该项目?
我试着将可见性设置为GONE或INVISIBLE,但在ListView的中间留下了一个空白区域。
我正在使用CursorAdapter来填充ListView。每个列表项目上都有一个3点菜单,显示删除选项。
这里是我当前的CursorAdapter代码如何从ListView中删除项目而不从数据库中删除项目?

public class ProductCursorAdapter extends CursorAdapter { 

private static final String LOG_TAG = ProductCursorAdapter.class.getSimpleName(); 
protected ContentResolver contentResolver; 

public ProductCursorAdapter(Context context, Cursor c, ContentResolver contentResolver) { 
    super(context, c); 
    this.contentResolver = contentResolver; 
} 

@Override 
public View newView(Context context, Cursor cursor, ViewGroup parent) { 
    return LayoutInflater.from(context).inflate(R.layout.list_item, parent, false); 
} 

@Override 
public void bindView(final View view, final Context context, final Cursor cursor) { 
    ImageView thumbnail = (ImageView) view.findViewById(R.id.thumbnail); 
    TextView name = (TextView) view.findViewById(R.id.name); 
    TextView quantity = (TextView) view.findViewById(R.id.quantity); 
    TextView price = (TextView) view.findViewById(R.id.price); 
    TextView supplier = (TextView) view.findViewById(R.id.supplier); 

    final long id = cursor.getLong(cursor.getColumnIndexOrThrow(ProductEntry._ID)); 

    ImageView threeDotMenu = (ImageView) view.findViewById(R.id.three_dot_menu); 
    threeDotMenu.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      PopupMenu popup = new PopupMenu(context, v); 
      popup.getMenuInflater().inflate(R.menu.list_item_context_menu, popup.getMenu()); 
      popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { 
       @Override 
       public boolean onMenuItemClick(MenuItem item) { 
        switch (item.getItemId()) { 
         case R.id.context_delete_product: 
          //the uri of the product we're deleting 
          Uri currentProductUri = ContentUris.withAppendedId(ProductEntry.CONTENT_URI, id); 
          //What to extract from the database 
          String[] projection = { 
            ProductEntry._ID, 
            ProductEntry.COLUMN_NAME, 
            ProductEntry.COLUMN_QUANTITY, 
            ProductEntry.COLUMN_PRICE, 
            ProductEntry.COLUMN_SUPPLIER, 
            ProductEntry.COLUMN_IMAGE 
          }; 
          //retrieve the product from the database before deleting in case 
          //we need to restore it later 
          Cursor cursor = contentResolver.query(currentProductUri, 
            projection, 
            null, 
            null, 
            null, 
            null); 
          cursor.moveToFirst(); 
          Snackbar snackbar = Snackbar.make(view.getRootView().findViewById(R.id.coordinator_layout), "Product Deleted", Snackbar.LENGTH_LONG); 
          snackbar.setAction("Undo", new MyUndoListener(cursor)); 
          snackbar.show(); 
          contentResolver.delete(currentProductUri, null, null); 
          return true; 
         default: 
          return false; 
        } 
       } 
      }); 
      popup.show(); 
     } 
    }); 


    . . . 


} 

public class MyUndoListener implements View.OnClickListener { 
    Cursor cursor = null; 

    public MyUndoListener(Cursor cursor) { 
     this.cursor = cursor; 

    } 

    @Override 
    public void onClick(View v) { 
     contentResolver.insert(ProductEntry.CONTENT_URI, extractFromCursor(cursor)); 
    } 

    private ContentValues extractFromCursor(Cursor cursor) { 

     int id = cursor.getInt(cursor.getColumnIndexOrThrow(ProductEntry._ID)); 

     String name = cursor.getString(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_NAME)); 

     int quantity = cursor.getInt(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_QUANTITY)); 

     int price = cursor.getInt(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_PRICE)); 

     String supplier = cursor.getString(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_SUPPLIER)); 

     byte[] image = cursor.getBlob(cursor.getColumnIndexOrThrow(ProductEntry.COLUMN_IMAGE)); 
     ContentValues value = new ContentValues(); 
     value.put(ProductEntry._ID, id); 
     value.put(ProductEntry.COLUMN_NAME, name); 
     value.put(ProductEntry.COLUMN_PRICE, price); 
     value.put(ProductEntry.COLUMN_QUANTITY, quantity); 
     value.put(ProductEntry.COLUMN_SUPPLIER, supplier); 
     value.put(ProductEntry.COLUMN_IMAGE, image); 
     cursor.close(); 
     return value; 

    } 

} 

}

+1

在表格中添加名为“deleted”的布尔类型的一列,如果删除则将其设为true,否则为false,并仅显示删除值为false的记录。 –

回答

0

嘛尼山,对于数据库值的本作ArrayList中,然后绑定列表视图。每当你想删除一个项目(不是从你的数据库),然后制作没有该项目的数组列表的副本,并再次绑定列表视图。

因此,您的数据库保持不变,您可以在撤消时再次使用它。 那么你想要删除的项目,绑定一个没有该项目的orignal arraylst中的新数组列表并使用它。

+0

'CursorAdapter'不能这样工作。它依赖于数据库游标而不是列表。 – Joshua