在android中删除listview中的选定行
我有一个自定义行的listview,它有一个textview和一个用于删除该行的可单击图像。Listview从sqlite数据库获取数据。我已成功地将数据库中的数据加载到listview中。我想要的是在按下delete按钮时从数据库中删除该行。我知道这需要将onclick事件处理程序绑定到delete按钮,并获取与行绑定的对象或sqlite数据。如何将sqlite数据绑定到用户单击delete按钮所在的行? 这是我的listview适配器在android中删除listview中的选定行,android,sqlite,listview,binding,Android,Sqlite,Listview,Binding,我有一个自定义行的listview,它有一个textview和一个用于删除该行的可单击图像。Listview从sqlite数据库获取数据。我已成功地将数据库中的数据加载到listview中。我想要的是在按下delete按钮时从数据库中删除该行。我知道这需要将onclick事件处理程序绑定到delete按钮,并获取与行绑定的对象或sqlite数据。如何将sqlite数据绑定到用户单击delete按钮所在的行? 这是我的listview适配器 public class CommentAdapter
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;
}
}
公共类CommentAdapter扩展了ArrayAdapter{
//私人物品
私人名单;
私人停车场;
公共CommentAdapter(上下文c、int textViewResourceId、列表){
super(c,textViewResourceId,list);
mListComment=列表;
//创建布局充气器
mInflater=LayoutInflater.from(c);
}
@凌驾
public int getCount(){
返回mListComment.size();
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//获取视图引用
视图=转换视图;
//如果为空
如果(视图==null){
//膨胀新布局
视图=mInflater.充气(R.layout.comment\u行,空);
//创建一个持有者
ViewHolder=新的ViewHolder();
//查找控件
holder.txtcoment=(TextView)view.findViewById(R.id.txtcoment);
holder.btnDelete=(ImageView)view.findViewById(R.id.btnDelete);
//设置要查看的数据结构
视图.设置标签(支架);
}
Comment cmt=mListComment.get(位置);
//如果不为空
如果(cmt!=null){
//查询数据结构
ViewHolder=(ViewHolder)view.getTag();
//设置要显示的数据
holder.txtcoment.setText(cmt.getComment());
holder.btnDelete.setClickable(true);
holder.btnDelete.setImageResource(android.R.drawable.ic_delete);
}
//返回视图
返回视图;
}
/*
*@classviewholder
*使用注释信息在视图中保留数据结构的步骤
*/
静态类视窗夹{
私有文本视图txtComment;
私有图像视图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;
}
}
公共类CommentsDataSource{
专用数据库;
私有数据库助手dbHelper;
私有字符串[]allColumns={DatabaseHelper.COLUMN\u ID,DatabaseHelper.COLUMN\u COMMENT};
公共评论数据源(上下文){
dbHelper=新数据库助手(上下文);
}
public void open()引发SQLException{
database=dbHelper.getWritableDatabase();
}
公众假期结束(){
dbHelper.close();
}
公共注释createComment(字符串注释){
//插入数据库
返回新成员;
}
专用注释光标或注释(光标){
//将光标转换为注释
回复评论;
}
公共无效删除注释(注释注释){
//从数据库中删除行
}
公共列表getAllComments(){
//获取所有行
返回评论;
}
}
您需要在扩展的列表活动中设置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();
}
现在,让处理程序删除所选行。您有列表视图
,当前视图
和索引id
。希望,它能像下面那样移动您的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;
}
编写button click的侦听器,并在onClick()方法中使用以下代码:
@Override
protected void onClick(View view){
view.getParent().setVisibility(View.GONE);
}
我希望这对你有用。
或者,由于我没有时间检查上述代码,如果这不起作用,在getView()
方法中,您可以将view
和按钮存储到两个单独的ArrayList
,然后从buttonArrayList
获取onClick()
中按钮的索引,并将视图ArrayList
中相同索引的可见性设置为GONE
。这个方法有点脏,所以我更喜欢上面的方法。Listview.setOnItemClickListener(新的OnItemClickListener(){
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();
}
});
@凌驾
public void onItemClick(适配器视图arg0、视图arg1、内部位置、长arg3){
//TODO自动生成的方法存根
列表。删除(位置);
notifyDataSetChanged();
}
});
在onclick事件处理程序中,当我引用cmt对象时,会收到错误消息,因为无法引用在不同方法中定义的内部类中的非最终变量cmt。你能告诉我吗help@just在类中声明您的Comment cmt
而不是在getView
方法中。实际上它不是必需的,只需将其声明为final就可以了。我将cmt声明为类变量,并将onclick处理程序修改为System.out.println(cmt.getId()+cmt.getComment());现在,当我单击每个行删除按钮时,我只得到了日志中显示的最后一行值。无需将其标记为类变量,请参见上面的注释,它将仅删除列表中的最后一个元素。您需要一个绑定到数据库的游标适配器。对数据库的更改将反映在游标适配器中。删除或插入数据库将反映在您的列表中。也许这有助于回答问题,您需要解释如何使用您的解决方案以及为什么这样可以解决问题