2013-03-15 4 views
0

목록에서 클릭 한 항목을 ListView (및 DB에서도 삭제해야합니다.ListView에서 삭제 버튼을 클릭하여 항목 삭제

이 작업을 수행하려면 문맥 메뉴를 사용하지 않지만이 어댑터의 "row.xml"에 사용자 지정 어댑터 (두 개의 단추 "삭제"및 "편집")가 있습니다.

그래서 ListView 및 DB에서 선택한 항목을 어떻게 삭제할 수 있습니까?

... with setTag() 클릭 한 요소의 ID를 상대 버튼으로 설정하고?

어떻게 데이터베이스에서 제거 할 수 있습니까?

내 어댑터입니다 : 리스너 (crudListeners)에서 OnClickListener를에서

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

단지 데이터베이스 및 어댑터의 데이터에서 요소를 제거합니다 (그것은 당신의 목록 객체가 될 것이다). 그런 다음 adapter.notifyDataSetChanged() 메소드를 호출하십시오. 도움이되기를 바랍니다.

+0

안녕하세요 Perroloco, 내 대답은 귀하의 답변을 주셔서 감사합니다. 그래서 ** 내 사용자 지정 어댑터 클래스 ** 내부에 ** 정의 된 수신기로 항목을 삭제할 것이므로 "어댑터에 대한 직접적인 참조가 없습니다. "이"를 통해 아니라면 ... "하지만 그것은 효과가 없습니다. – tune

1

어댑터를 사용하고 있다면 목록에서 항목을 삭제할 필요가 없습니다. onClick 방법으로 getView에 수신중인 poistion을 사용하여 DB에서 항목을 삭제해야합니다.

DB에서 개체를 제거하면 어댑터의 dataAdapter.notifyDataSetChanged();이 호출되어 목록이 새 데이터 집합으로 업데이트됩니다.

1

1) 어댑터의 목록 객체에 필드 참조를 유지 - 예를 들면 :

private ArrayList<Nota>list

2) 당신의 getView() 메소드의 위치로 최종 INT 참조를 작성,

같은 것을

: 당신이 삭제 버튼을 클릭하면

final int positionFinal

3), 다음 코드를 사용

충분히 명확하고 코드를 복사하여 붙여 넣기 만하면 사소하고 변경 사항을보기 어렵지 않기를 바랍니다. 목록 항목을 제거하는 애니메이션과 드래그 앤 드롭으로 정렬 할 수있는 기능을 추가해야하는 경우 다음 무료 라이브러리를 확인하십시오. DragSortListView

행운을 빈다!

+0

안녕하세요, anwser에 대해 감사드립니다. 귀하의 방법으로 선택한 항목을 삭제하는 코드를 작성하지만, "Public class ListaNotaAdapter extends ArrayAdapter "클래스에서 목록을 새로 고치는 것이 가능합니까? "이 경우 notifyDataSetChanged()"작업을 알고 있습니다 ... – tune

관련 문제