2013-03-15 142 views
0

我需要從列表視圖(和數據庫太)中刪除從列表中單擊的項目。從ListView中刪除項目單擊刪除按鈕

要做這個任務,我沒有使用上下文菜單,但我在這個適配器「row.xml」中構建了一個自定義適配器, 有兩個按鈕「刪除」和「編輯」。

那麼,如何刪除從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; 
    } 
} 

回答

0

在onClickListener從監聽器(crudListeners)只是從數據庫和適配器的數據刪除的元素(這將是你的List對象)。 然後,只需調用adapter.notifyDataSetChanged()方法。 希望它有幫助

+0

嗨Perroloco,感謝您的回答,所以在我的情況下,我要刪除與我的自定義適配器類**中定義的監聽器的項目,所以我沒有直接引用「適配器「如果不通過」這個對象「......但它不起作用。 – tune 2013-03-18 11:37:52

1

如果您使用的是適配器,那麼不需要從它自己的列表中刪除該項目。您必須使用poistion從數據庫中刪除該項目,該poistion將通過onClick方法中的getView進行回收。

當您從DB中刪除對象時,請在適配器上調用dataAdapter.notifyDataSetChanged();以使用新的數據集更新列表。

1

1)保持一個字段參考您的適配器列表對象 - 例如:

private ArrayList<Nota>list

2)在您的getView()方法創建一個最終詮釋參考位置,像

final int positionFinal

3)當你點擊刪除按鈕,使用下面的代碼:

list.removeItem(positionFinal); 
notifyDataSetChanged(); 

我希望這已經夠清楚了,不想複製和粘貼你的代碼只是爲了輕微和難以看到它的變化。 如果您需要添加動畫以移除列表項並且可以通過拖放功能對其進行排序,請查看此免費庫:DragSortListView

祝您好運!

+0

嗨npace謝謝你的anwser。我寫的代碼,刪除您的方式選擇的項目,但怎麼可能從類刷新清單「公共類ListaNotaAdapter擴展ArrayAdapter 」?我知道「notifyDataSetChanged()」在這種情況下工作... – tune 2013-03-18 10:22:45