2012-07-11 7 views
10

voglio eliminare una certa riga da una listView quando un ImageView viene cliccato. Il mio listview assomiglia a questo: enter image description hereremoveView (Vedi) non è supportata in AdapterView

Voglio che quando viene cliccata l'ultima immagine per eliminare quella riga. Qui è il mio adattatore:

public class UserItemAdapter extends ArrayAdapter<Photos.Record> { 
     private ArrayList<Photos.Record> photos; 

     public UserItemAdapter(Context context, int textViewResourceId, ArrayList<Photos.Record> photos) { 
      super(context, textViewResourceId, photos); 
      this.photos = photos; 
     } 

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


      if (v == null) { 
       LayoutInflater vi = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
       v = vi.inflate(R.layout.photorowlist, null); 
           v.setClickable(true); 
           v.setFocusable(true); 
      } 

      Photos.Record user = photos.get(position); 
      if (user != null) { 
       TextView photo_name = (TextView) v.findViewById(R.id.photoname); 

       if (photo_name != null) { 
        photo_name.setText(user.photo_name); 
       } 

      } 
         v.setOnClickListener(new OnClickListener() { 

         @Override 
         public void onClick(View view) { 
          //Toast.makeText(view.getContext(), "Clicked", Toast.LENGTH_SHORT).show(); 

          ImageView delete_photo = (ImageView) view.findViewById(R.id.deletephoto); 
          delete_photo.setOnClickListener(new OnClickListener(){ 
          @Override 
          public void onClick(View v) { 
           Toast.makeText(Photos.this, "Delete Button Clicked", Toast.LENGTH_SHORT).show(); 
           listView.removeView(v); 
           myadapter.notifyDataSetChanged(); 


       }}); 
         } 

         }); 


      return v; 
     } 
    } 

    public class Record { 
     public String photo_name; 

     public Record(String photo_name) { 
      this.photo_name = photo_name; 
     } 
    } 

ho cercato di eliminare la riga con questa:

listView.removeView(v); 
myadapter.notifyDataSetChanged(); 

e ottengo l'errore: ERROR AndroidRuntime java.lang.UnsupportedOperationException: removeView(View) is not supported in AdapterView

Dov'è il mio mystake? Qualche idea?

risposta

20

Non è necessario rimuovere il View ma rimuovere gli elementi nel proprio elenco foto.

photos.remove(yourPhoto); 
notifyDataSetChanged(); 

Inoltre, si dovrebbe usare ViewHolders, c'è un sacco di Tuts in Google. Spero che questo ti possa aiutare.

+0

No, ma penso che tu stia facendo la strada sbagliata. Non dovresti scrivere il tuo ClickListener nel tuo adattatore ma nella tua attività (o frammento). Quindi imposti un OnItemClickListener per la tua vista ed elimina qui la tua foto. Non sono sicuro che io sia chiaro, ma si dovrebbe avere uno sguardo su [blog di Cyril Mottier] (http://android.cyrilmottier.com/?p=525) – AMerle

+0

ho provato tale soluzione (rimuovendo i dati dal arraylist dell'adattatore e poi rinfrescante) ma non ha funzionato. Aperto un altro problema qui: http://stackoverflow.com/questions/38250987/removing-an-item-from-the-dropdown-list-of-a-baseadapter –

1

Si dovrebbe provare sul thread dell'interfaccia utente in modo che funzioni istantaneamente:

 listView.remove(position); 
     runOnUiThread(new Runnable() { 
      public void run() { 
       adapter.notifyDataSetChanged(); 
      } 
     }); 
9

In onItemClick (AdapterView genitore, Panorama vista, la posizione int, long id) utilizzare

parent.removeViewInLayout(view);

invece di

parent.removeViewAt(position);