【问题标题】:Remove a view/value from the listview Android从列表视图 Android 中删除视图/值
【发布时间】:2016-10-25 05:53:38
【问题描述】:

我的数据库中有一些值,并使用自定义光标适配器填充自定义 Listview 中的值。因此,当用户单击 listView 时,会打开一个新 Activity,并且当他选择删除按钮时,该值或视图应该消失,列表应该被刷新。

我在 SO 上提到了很多答案,但他们都建议从数据库中删除值(这不是我想要的),有些人正在使用 ArrayList 并建议我将它与自定义数组适配器一起使用。但我是使用光标适配器。

所以我的整个问题是如何从列表视图中删除一个值或删除一个视图?

Listview 项 onClick Listener 打开一个新的 Activity

@Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
//  Constants.ROW_NUMBER=position;
        TextView getRecordID = (TextView) view.findViewById(R.id.recordID);
        Constants.ROW_NUMBER = Integer.parseInt(getRecordID.getText().toString());

        Intent editIntent = new Intent(this,NoteDisplay.class);
        editIntent.putExtra(Constants.ROW_NAME,Constants.ROW_NUMBER);
        startActivity(editIntent);

    }

这是新的活动,在按下菜单按钮时,记录将被标记为已删除,但不会从数据库中删除。

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch (item.getItemId())
        {

            case R.id.deletebutton:

                DataBaseHelper deletedb = new DataBaseHelper(this);
                int deletedata = deletedb.deleteAction(position,System.currentTimeMillis());
                Intent dintent = new Intent(this,MainActivity.class);
                dintent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
                startActivity(dintent);

                return true;

            default:
                return super.onOptionsItemSelected(item);

        }
    }

这是我的自定义光标适配器类,

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



    @Override
        public void bindView(View view, Context context, Cursor cursor) {
    //int getDeleteFlag is initialized above
              getDeleteFlag = cursor.getInt(cursor.getColumnIndex(DELETE_FLAG));

        if(getDeleteFlag==0)
        {
            ll = (LinearLayout)view.findViewById(R.id.listViewLayout);
            setListViewHeight(ll,context);

            if (cursor != null) {
                getText = cursor.getString(cursor.getColumnIndex(NOTE_TITLE));
                existsRecordID = cursor.getString(cursor.getColumnIndex(RECORD_ID));
                datevalue = cursor.getLong(cursor.getColumnIndex(RECORD_DATE));
}
            Date newdate = new Date(datevalue);
            tv = (TextView) view.findViewById(R.id.content);
            recordID = (TextView) view.findViewById(R.id.recordID);
            dateET = (TextView) view.findViewById(R.id.date);
            tv.setText(getText.trim());
            recordID.setText(existsRecordID);
            dateET.setText(dateFormatter.format(newdate));
        }else{
            Toast.makeText(context, "FALSE VALUE", Toast.LENGTH_SHORT).show();
        }

        }

此时我很困惑是否要删除视图或值。

我的数据库中有一个名为“deleteflag”的行,其中存储 1=> 已删除 0=>未删除。

因此只有具有 1 的值才会被标记为已删除。

编辑 1:

我的bindView()方法中的上述代码不起作用

【问题讨论】:

  • 如果您只是从列表视图中删除,那么届时它将被删除但不会从数据库中删除,因此当您再次进入该页面时,您可以看到已删除的视图(行),因为它不是从数据库中删除
  • @Piyush 如果我只检查if(deleteflag==0) 然后显示视图,否则不显示呢?如果是的话怎么做?
  • 您可以将该标志存储在数据库中
  • 是的,您可以设置一个标志来显示 listView,然后 listView 项目将仅以这种方式显示。 @Piyush
  • @Piyush 是的,如果标志为 0,那么我也在这样做,然后显示在视图中,如果 1 可以执行什么操作?即删除视图或在这种情况下可以做什么?

标签: android listview


【解决方案1】:

正如你所说,不要从数据库中删除项目,只需将 deleteflag = 1 没关系

但是当您回到您的列表或来到您的列表时,您应该执行以下操作

Cursor yCursor = db.rawQuery("SELECT  * FROM table where deleteflag!=1", null);
yAdapter.changeCursor(yCursor);

如果您正在使用活动,则可以在 onactivityresult 或 onResume of activity 中执行此操作

它只会用未删除的最新光标刷新您的适配器

【讨论】:

  • 是的,我试过了兄弟,但尽管使用了删除标志,但该项目仍然出现在列表视图中。
  • 当我查看您的代码时,您正在从数据库中提取所有数据并检查 bindview 中的标志。但我是说不要把所有数据都写到查询中。你能分享你的数据库查询吗?
【解决方案2】:

您必须将该 deleteFlag 值存储在具有 0 和 1 值的数据库中。

因此,当您当时尝试删除行/视图时,您必须将该标志值从 0 更新为 1。

此外,更新旧数据后,您必须执行从数据库中删除该行的查询。

那么在从数据库中删除数据后不要忘记调用yourAdapterName.notifyDataSetChanged();。

如果这不能解决您的问题,请随时发表评论

你可以看到这个link会帮助你。

而你在适配器中编写了错误的代码。

您不能通过检查光标中的条件 bcz 是否还持有具有 deleteFlag=1 的数据来过滤适配器内部;所以如果条件不起作用

您必须从我分享的链接执行此步骤。

您必须更新 Cursor,而不是 CursorAdapter。

newCursor = db.rawQuery( "SELECT * FROM mytable where deleteflag ==0 ", null); 
myCursorAdapter.changeCursor(newCursor);

所以最后它会做的是只保存那些具有 deleteFlag ==0

的记录

所以它会解决你的问题,并且不会显示不包含 deleteFlag=1 的额外行;

希望这能解决您的问题。

如果这对您有帮助,请标记为已接受的答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多