从ListView中删除项目,单击删除按钮

时间:2013-03-15 13:51:03

标签: android android-listview delete-row

我需要从ListView(以及DB中)删除从列表中单击的项目。

要执行此任务,我不使用上下文菜单,但我构建了一个自定义适配器, 在这个适配器“row.xml”中有两个按钮“删除”和“编辑”。

那么,如何删除从de ListView和DB中选择的项目呢?

...使用setTag()我将点击元素的ID设置为相对按钮,而不是?

如何从数据库中删除?

这是我的适配器:

package com.prendonota;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.Toast;

import com.prendonota.activeRecord.Nota;

public class ListaNotaAdapter extends ArrayAdapter<Nota> {

    public Nota nota;
    public OnClickListener crudListeners;

    /**
     * Costruttore ereditato
     * @param context
     * @param textViewResourceId
     * @param objects
     */
    public ListaNotaAdapter(Context context, int textViewResourceId, List<Nota> objects) {
        super(context, textViewResourceId, objects);
    }       





    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View row = null;
        final View delete;
        final View edit;

        //*** prima di tutto è necessario crearsi un oggetto inflater che
        //*** intrinsecamente associ il contesto attuale su cui si sta agendo
        //*** e il servizio che si è richiesto "layout_inflater"
        LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        //*** una volta che ho l'oggetto inflater che associa contesto+servizio posso procedere
        //*** nell'identificazione dell'xml da usare
        row = inflater.inflate(R.layout.row, null );

        //*** una volta che ho la vista relativa al contesto attuale e relativa all'xml desiderato per layout
        //*** mi richiamo i propri elementi interni a cui associare i dati dell'oggetto item di turno
        TextView data       = (TextView)row.findViewById(R.id.item_data);
        TextView oggetto    = (TextView)row.findViewById(R.id.item_oggetto);
        delete  = (ImageButton)row.findViewById(R.id.button_row_delete);
        edit    = (ImageButton)row.findViewById(R.id.button_row_edit);

        //*** prende l'oggetto nell'array "Nota[] objects" passato in argomento
        //*** dato il proprio indice di posizione
        nota = getItem(position);

        //**** in fine associo agli appositi oggetti "TextView" i rispettivi valori
        data.setText(nota.get_dataInserimentoModifica());
        oggetto.setText(nota.get_oggetto());

        //*** poi associo i tag ai relativi pulsanti "Delete" e "Edit"
        delete.setTag(nota.get_id());
        edit.setTag(nota.get_id());

        //*** assegnazione dei listeners ai rispettivi pulsanti
        delete.setOnClickListener(crudListeners);
        edit.setOnClickListener(crudListeners);

        //*** inizializzo la variabile crudListeners che gestisce i listeners sui pulsanti
        crudListeners = new OnClickListener() {
            @Override
            public void onClick(View v) {
                int idnota = (Integer)v.getTag();
                StringBuilder msg = new StringBuilder("ID nota ").append(idnota);
                if(v.getId()==delete.getId()){
                    msg.append(" DELETE");
                }else{
                    msg.append(" EDIT");
                }
                Toast.makeText(getContext(), msg, Toast.LENGTH_SHORT).show();
            }
        };      

        //*** torno la vista che finirà dentro "setAdapter()"
        return row;
    }
}

3 个答案:

答案 0 :(得分:1)

如果您使用的是适配器,则无需从列表中删除该项目。您必须使用poistion方法getView中正在使用的onClick从数据库中删除该项目。

当您从数据库中删除对象时,请调用适配器上的dataAdapter.notifyDataSetChanged();以使用新数据集更新列表。

答案 1 :(得分:1)

1)保持对适配器中List对象的字段引用 - 例如:

private ArrayList<Nota>list

2)在getView()方法中创建一个最终的int引用,类似于

final int positionFinal

3)单击“删除”按钮时,请使用以下代码:

list.removeItem(positionFinal);
notifyDataSetChanged();

我希望这很清楚,不想复制和粘贴你的代码只是为了做一些次要的,很难看到它的改动。 如果您需要添加动画来删除列表项以及通过拖放对它们进行排序的功能,请查看此免费库:DragSortListView

祝你好运!

答案 2 :(得分:0)

在来自侦听器的onClickListener(crudListeners)中,只需从数据库中删除元素,然后从适配器的数据中删除元素(它将是您的List对象)。 然后只需调用adapter.notifyDataSetChanged()方法。 希望它有所帮助