2013-04-17 12 views
5

Ho un elemento listview personalizzato che include un pulsante "rimuovi". Ho creato un adattatore personalizzato chiamato LazyListAdapter che si estende BaseAdapter. All'interno del metodo GetView che sovrascrivo ho impostato il metodo onclick di questo tasto come segue:Rimozione di un elemento da ListView all'interno di un adattatore personalizzato

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

    View v = convertView; 

    // Some other things... 

    ImageButton removeFav = (ImageButton) v.findViewById(R.id.removeFavorites); 

    removeFav.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 

      // I delete the object from Parse database here, 
      // Therefore I want the view to disappear here 
    } 
} 

Come posso cancellare o in qualche modo nascondere la vista corrispondente utilizzando un codice all'interno di questo metodo onclick? O dovrei cambiare il mio approccio?

Grazie mille in anticipo.

+2

chiamata 'notifyDataSetChanged()' in 'onClick()'; –

+0

Quanti elementi ci sono nel tuo elenco? Potresti considerare di riutilizzare le viste –

+0

In media, non avrò più di 20-30 visualizzazioni anche se cambieranno da un utente a un altro. Non so come riutilizzare le viste. – ecem

risposta

7

Prova questo

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

    View v = convertView; 

    // Some other things... 

    ImageButton removeFav = (ImageButton) v.findViewById(R.id.removeFavorites); 

    removeFav.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 

     // After you delete the object from Parse database here, 
     notifyDataSetChanged(); 

    } 
} 
+0

@ecem: per favore chiarisci quale modifica vuoi fare qui. Questa è una buona pratica ogni volta che fai una modifica per favore lascia una nota laggiù. – Ankit

+0

Ho solo modificato la spaziatura in modo che il codice sia più leggibile per i futuri visitatori. Niente di più. – ecem

+0

È normale? Voglio dire, voglio anche mostrare il tipico messaggio di conferma (sei sicuro, sì/no). Dovrei inserire il codice all'interno dell'adattatore? Grazie. @Ankit – Ricardo

0

provare a utilizzare parent.removeViewAt (posizione).

+0

Questo è l'errore che ottengo usando la tua risposta, 'java.lang.UnsupportedOperationException: removeViewAt (int) non è supportato in AdapterView' – ArtiomLK

0

Semplicemente è possibile rimuovere un elemento all'interno metodo GetView come nell'esempio

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

    ViewHolder viewHolder; 

    if (convertView == null) { 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = inflater.inflate(R.layout.list_row, null, false); 
     viewHolder = new ViewHolder(); 
     viewHolder.img = (ImageView) convertView.findViewById(R.id.img); 
     convertView.setTag(viewHolder); 

    } else { 
     // we call the view created before to not create a view in each time 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    final int imgId = imageId.get(position); 

    viewHolder.img.setImageResource(imgId); 

    viewHolder.img.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      Toast.makeText(context, "Clicked " + imgId, Toast.LENGTH_SHORT) 
        .show(); 
     } 
    }); 

    // Create a generic swipe-to-dismiss touch listener. 
    viewHolder.img.setOnTouchListener(new SwipeDismissTouchListener(
      viewHolder.img, null, 
      new SwipeDismissTouchListener.DismissCallbacks() { 
       @Override 
       public boolean canDismiss(Object token) { 
        return true; 
       } 

       @Override 
       public void onDismiss(View view, Object token) { 

        Log.d(TAG, "Image ıd" + imgId); 


        imageId.remove(position); 
        remove(position); 

        notifyDataSetChanged(); 
       } 
      })); 

    return convertView; 
} 
Problemi correlati