Удалить выбранную строку в списке просмотра в Android - PullRequest
3 голосов
/ 31 марта 2012

У меня есть список с пользовательской строкой, имеющей текстовый вид, и изображение, которое можно щелкнуть, для удаления строки. 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;
}

}

Ответы [ 4 ]

2 голосов
/ 31 марта 2012

Добавьте ваш метод 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;
}
0 голосов
/ 11 мая 2015
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();
    }
});
0 голосов
/ 31 марта 2012

напишите слушателю для нажатия кнопки и в методе onClick () используйте этот код:

@Override
protected void onClick(View view){
    view.getParent().setVisibility(View.GONE);
}

Я надеюсь, что это будет работать для вас.С другой стороны, поскольку у меня нет времени проверять приведенный выше код, если он не работает, в методе getView() вы можете сохранить view и кнопку в двух отдельных ArrayList, а затем получить индекскнопки в onClick(), от кнопки ArrayList и установите видимость того же индекса в представлении ArrayList, что и GONE.Этот метод довольно грязный, поэтому я предпочитаю вышеуказанный метод.

0 голосов
/ 31 марта 2012

Вам необходимо установить onlistitemclicklistener в расширенном ListActivity. Было бы что-то вроде этого.

@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. Надеюсь, это будет работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...