在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();
    

现在,让您的处理程序删除选定的行。你有listviewcurrent viewindexed 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中删除选定的行的主要内容,如果未能解决你的问题,请参考以下文章

如何动画添加或删除 Android ListView 行

如何从 ListView 中删除 Firebase Android 中的特定节点

VB中如何在listview添加内容以及删除选定项

android从listview中删除任何项目删除最后一个元素

检测哪个选定项目(在 ListView 多列中)产生了 ContextMenu (Android)

取消选择 ListView 中的选定项目