在android中删除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

我有一个自定义行的listview,它有一个textview和一个用于删除该行的可单击图像。Listview从sqlite数据库获取数据。我已成功地将数据库中的数据加载到listview中。我想要的是在按下delete按钮时从数据库中删除该行。我知道这需要将onclick事件处理程序绑定到delete按钮,并获取与行绑定的对象或sqlite数据。如何将sqlite数据绑定到用户单击delete按钮所在的行? 这是我的listview适配器

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
,然后从button
ArrayList
获取
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());现在,当我单击每个行删除按钮时,我只得到了日志中显示的最后一行值。无需将其标记为类变量,请参见上面的注释,它将仅删除列表中的最后一个元素。您需要一个绑定到数据库的游标适配器。对数据库的更改将反映在游标适配器中。删除或插入数据库将反映在您的列表中。也许这有助于回答问题,您需要解释如何使用您的解决方案以及为什么这样可以解决问题