在android的listview中删除选定的行
Posted
技术标签:
【中文标题】在android的listview中删除选定的行【英文标题】:Delete selected row in listview in android 【发布时间】:2012-04-14 17:31:02 【问题描述】:我有一个带有自定义行的列表视图,其中包含一个文本视图和一个用于删除该行的可点击图像。 Listview 从 sqlite 数据库中获取数据。我已成功将数据库中的数据加载到列表视图中。我想要的是在按下删除按钮时从数据库中删除该行。我知道这需要将 onclick 事件处理程序绑定到删除按钮并获取与行绑定的对象或 sqlite 数据。如何获取与用户单击删除按钮的行绑定的 sqlite 数据? 这是我的列表视图适配器
public class CommentAdapter extends ArrayAdapter<Comment>
// private objects
private List<Comment> mListComment;
private LayoutInflater mInflater;
public CommentAdapter(Context c,int textViewResourceId, List<Comment> list)
super(c, textViewResourceId, list);
mListComment = list;
// create layout inflater
mInflater = LayoutInflater.from(c);
@Override
public int getCount()
return mListComment.size();
@Override
public long getItemId(int position)
return position;
@Override
public View getView(int position, View convertView, ViewGroup parent)
// get view reference
View view = convertView;
// if null
if(view == null)
// inflate new layout
view = mInflater.inflate(R.layout.comment_row, null);
// create a holder
ViewHolder holder = new ViewHolder();
// find controls
holder.txtComment = (TextView)view.findViewById(R.id.txtComment);
holder.btnDelete = (ImageView)view.findViewById(R.id.btnDelete);
// set data structure to view
view.setTag(holder);
Comment cmt = mListComment.get(position);
// if not null
if(cmt != null)
// query data structure
ViewHolder holder = (ViewHolder)view.getTag();
// set data to display
holder.txtComment.setText(cmt.getComment());
holder.btnDelete.setClickable(true);
holder.btnDelete.setImageResource(android.R.drawable.ic_delete);
// return view
return view;
/*
* @class ViewHolder
* to hold data structure on view with comment info
*/
static class ViewHolder
private TextView txtComment;
private ImageView btnDelete;
这是我的 CommentsDataSource 类
public class CommentsDataSource
private SQLiteDatabase database;
private DatabaseHelper dbHelper;
private String[] allColumns = DatabaseHelper.COLUMN_ID, DatabaseHelper.COLUMN_COMMENT ;
public CommentsDataSource(Context context)
dbHelper = new DatabaseHelper(context);
public void open() throws SQLException
database = dbHelper.getWritableDatabase();
public void close()
dbHelper.close();
public Comment createComment(String comment)
//insert into databasae
return newComment;
private Comment cursorToComment(Cursor cursor)
//convert cursor to comment
return comment;
public void deleteComment(Comment comment)
//delete row from datbase
public List<Comment> getAllComments()
//get all rows
return comments;
【问题讨论】:
您需要一个绑定到数据库的游标适配器。对数据库的更改会反映在游标适配器中。然后删除或插入数据库将反映在您的列表中。 【参考方案1】:将您的 getView 方法移动如下:
@Override
public View getView(int position, View convertView, ViewGroup parent)
// get view reference
View view = convertView;
// if null
if(view == null)
// inflate new layout
view = mInflater.inflate(R.layout.comment_row, null);
// create a holder
ViewHolder holder = new ViewHolder();
// find controls
holder.txtComment = (TextView)view.findViewById(R.id.txtComment);
holder.btnDelete = (ImageView)view.findViewById(R.id.btnDelete);
// set data structure to view
view.setTag(holder);
final Comment cmt = mListComment.get(position);
// if not null
if(cmt != null)
// query data structure
ViewHolder holder = (ViewHolder)view.getTag();
// set data to display
holder.txtComment.setText(cmt.getComment());
holder.btnDelete.setClickable(true);
holder.btnDelete.setImageResource(android.R.drawable.ic_delete);
holder.btnDelete.setOnClickListener(new View.OnClickListener()
public void onClick(View view)
commentsDataSource.deleteComment(cmt);
//Requery DB to get Updated results
notifyDataSetChanged();
)
// return view
return view;
【讨论】:
在 onclick 事件处理程序中,当我引用 cmt 对象时,我收到错误消息,因为无法引用在不同方法中定义的内部类中的非最终变量 cmt。你能帮忙吗 @just 在你的类中声明你的Comment cmt
而不是在getView
方法中。
其实不需要,只要声明为final就可以了
我将 cmt 声明为类变量并将 onclick 处理程序修改为 System.out.println(cmt.getId()+cmt.getComment());现在,当我单击每一行删除按钮时,我只得到日志中看到的最后一行值
不需要将它贴为类变量,请参阅我上面的评论,它只会删除列表的最后一个元素。【参考方案2】:
您需要在扩展的ListActivity
中设置您的onlistitemclicklistener
。应该是这样的。
@Override
protected void onListItemClick(ListView l, View v, int position, long id)
ViewHolder item = (ViewHolder ) getListAdapter().getItem(position);
Toast.makeText(this, item.txtComment + " selected", Toast.LENGTH_LONG).show();
现在,让您的处理程序删除选定的行。你有listview
、current view
和indexed id
。希望,它会工作
【讨论】:
【参考方案3】:为按钮单击编写一个监听器,并在 onClick() 方法中使用以下代码:
@Override
protected void onClick(View view)
view.getParent().setVisibility(View.GONE);
我希望这对你有用。
或者,由于我没有时间检查上面的代码,如果这不起作用,在getView()
方法中,您可以将view
和按钮存储到两个单独的ArrayList
中,然后获取索引onClick()
中的按钮,来自按钮ArrayList
,并将视图ArrayList
中相同索引的可见性设置为GONE
。这种方法有点脏,所以我更喜欢上面的方法。
【讨论】:
【参考方案4】:Listview.setOnItemClickListener(new OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3)
// TODO Auto-generated method stub
List.remove(position);
notifyDataSetChanged();
);
【讨论】:
也许这有助于回答问题,您需要说明如何使用您的解决方案以及为什么这样可以解决问题以上是关于在android的listview中删除选定的行的主要内容,如果未能解决你的问题,请参考以下文章
如何从 ListView 中删除 Firebase Android 中的特定节点
android从listview中删除任何项目删除最后一个元素