如何从adapte中删除ListView中的项目

时间:2016-03-17 05:47:38

标签: android listview android-adapter

我不能让这个工作。我希望在单击按钮时删除列表视图中的项目。但我真的不知道如何实现这一点。

这是我的适配器

    public class PersonalRecordsAdapterDialog extends CursorAdapter {

    public PersonalRecordsAdapterDialog(Context context, Cursor c) {
        super(context, c);
    }

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

    @Override
    public void bindView(View view, Context context, final Cursor cursor) {
        final DatabaseAdapter db = new DatabaseAdapter(context);
        TextView weightTV = (TextView) view.findViewById(R.id.weight_tv);
        TextView dateTV = (TextView) view.findViewById(R.id.date_tv);
        final Button deleteRecord = (Button) view.findViewById(R.id.delete_record);
        final String id = cursor.getString(cursor.getColumnIndex(DatabaseAdapter.DatabaseHelper.COL_1));
        String weight = cursor.getString(cursor.getColumnIndex(DatabaseAdapter.DatabaseHelper.COL_3));
        String date = cursor.getString(cursor.getColumnIndex(DatabaseAdapter.DatabaseHelper.COL_4));
        weightTV.setText(weight);
        dateTV.setText(date);

        deleteRecord.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                db.remove(Integer.parseInt(id));
                notifyDataSetChanged();
            }
        });
    }
}

这是我的ListView

   AlertDialog.Builder builder = new AlertDialog.Builder(holder.mContext);
            View dialogView = View.inflate(holder.mContext,R.layout.dialog, null);
            ListView myList = (ListView) dialogView.findViewById(R.id.dialog_list_view);

            Cursor cursor = holder.myDb.getRows(exercise[position]);
            PersonalRecordsAdapterDialog adapter = new PersonalRecordsAdapterDialog(holder.mContext,cursor);
            myList.setAdapter(adapter);
            builder.setView(dialogView)
                    .setTitle("History of your " + exercise[position].toLowerCase() + " records")
                    .setPositiveButton("Ok", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int id) {
                            // sign in the user ...
                        }
                    });
            AlertDialog b = builder.create();
            b.show();

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

onClick发生时,从同一个适配器调用notifyDatasetChanged()中删除模型中的项目

并且在您的情况下,您将光标直接传递给自定义适配器,这是一种非常糟糕的做法,因为在这种情况下,您与数据库的连接将保持打开状态并导致内存和数据库问题

因此,您可以创建自己的模型(ArrayList),从游标获取值,将它们添加到模型中,关闭数据库连接并将该模型传递给适配器。并删除特定项目从模型中删除并调用notifyDatasetChanged()。(注意:从模型中删除只会从列表中删除数据,但不会从db中删除。如果要从数据库中删除该数据,还必须执行删除查询)

为此:当我点击ListView项目时,我不想删除它。我只想在单击ListView项目中的按钮

时删除它

转到适配器类..使用OnGetView(...)方法和onClickListener for the same over there方法获取对象实例。

要从DB中删除行,您可以使用db表中的唯一ID,如此

public void delete_byID(int id){
 sqLiteDatabase.delete(MYDATABASE_TABLE, KEY_ID+"="+id, null);
}

您要删除的表格MYDATABASE_TABLE

KEY_ID is the name of the coloumn to put where condition.
id  is the unique id associated with the row you want to delete 

因此,在这种情况下,您不需要光标删除特定记录

答案 1 :(得分:0)

bindView方法不会因db更改而刷新的原因是: 光标是旧光标的钢。 您需要重新查询数据库获取新游标然后 调用adapter.change游标(passHereTheNewCursor)

答案 2 :(得分:0)

Nitesh添加上述答案 - 要在按钮点击时从列表视图中删除项目,请先1.首先需要从listview的适配器中删除项目,如下所示 -

deleteButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
              Object objToRemove = adapter.getItem([POSITION]);
              adapter.remove(objToRemove);
}
}

或2.您可以从arrayList&中删除此项目。调用notifyDataSetChanged()。

但这不会从数据库中删除。你必须为它实现删除查询。

并且如上所述 - 在你的情况下,你将光标直接传递给你的自定义适配器这是一个非常糟糕的做法,因为在这种情况下你与数据库的连接将保持打开状态,并可能导致内存和数据库问题。