2014-04-16 6 views
5

Ich habe eine benutzerdefinierte Listenansicht, die 2 Textansichten und 2 Tasten (Wiedergabe und Löschen) Ich möchte, wenn ich auf die Schaltfläche Löschen, um die aktuelle Zeile zu löschen.Entfernen von Element aus benutzerdefinierten Listenansicht auf Schaltfläche klicken

Meine Adapterklasse

import java.util.ArrayList; 

import android.content.Context; 
import android.graphics.Color; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.Button; 
import android.widget.TextView; 

public class SunetePreferateAdaptor extends BaseAdapter { 

    class ob { 
     String titlu, descriere; 

     public ob(String titlu, String descriere) { 
      this.titlu = titlu; 
      this.descriere = descriere; 
     } 
    } 

    ArrayList<ob> lista; 
    Context context; 

    public SunetePreferateAdaptor(Context context) { 
     this.context = context; 
     lista = new ArrayList<ob>(); 

     for (int i = 1; i <= 20; i++) { 
      lista.add(new ob("text", "text2")); 

     } 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return lista.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return lista.get(arg0); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 

    @Override 
    public View getView(int arg0, View arg1, ViewGroup arg2) { 
     // TODO Auto-generated method stub 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View row = inflater.inflate(R.layout.single_favsound_row, arg2, false); 

     Button b2 = (Button) row.findViewById(R.id.button2); 
     b2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       // here, i want to delete the current row of the listview 
       // 
       // 
      } 
     }); 
     TextView titlu = (TextView) row.findViewById(R.id.singleText2); 
     titlu.setText(lista.get(arg0).titlu); 
     titlu.setTextColor(Color.WHITE); 
     titlu.setTypeface(Global.font1); 
     TextView descriere = (TextView) row.findViewById(R.id.singleText1); 
     descriere.setText(lista.get(arg0).descriere); 
     descriere.setTextColor(Color.WHITE); 
     descriere.setTypeface(Global.font1); 

     return row; 
    } 
} 

Nun, wie kann ich das tun? Ich habe versucht, die Arraylist statisch zu machen und ihre Produkte auf Klick löschen .. aber kein Erfolg ..

Antwort

8

Sie müssen ArrayList nicht statisch machen.

Sie müssen die Daten aus der Liste löschen, die Listenansicht enthält. Sie rufen notifyDataSetChanged(); auf, um die Sicht zu aktualisieren.

Sie können das statische Schlüsselwort entfernen und

Button b2 = (Button) row.findViewById(R.id.button1); 
     b2.setTag(arg0); 
     b2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       int pos = (int)arg0.getTag(); 
        lista.remove(pos); 
        SunetePreferateAdaptor.this.notifyDataSetChanged();   } 
     }); 

Alternative verwenden:

Sie die Liste an den Konstruktor der Adapterklasse passieren können.

ListView lv = (ListView) this.findViewById(R.id.listView1);  
    ArrayList<ob> lista = new ArrayList<ob>(); 

     for (int i = 1; i <= 20; i++) { 
      lista.add(new ob("text", "text"+i)); 

     } 

lv.setAdapter (new SunetePreferateAdaptor (this, lista));

Dann haben diese in einer separaten .java-Datei

class ob { 
    String titlu, descriere; 

    public ob(String titlu, String descriere) { 
     this.titlu = titlu; 
     this.descriere = descriere; 
    } 
} 

Dann

public class SunetePreferateAdaptor extends BaseAdapter { 


    ArrayList<ob> lista; 
    Context context; 

    public SunetePreferateAdaptor(Context context, ArrayList<ob> lista) { 
     this.context = context; 
     this.lista= lista; 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return lista.size(); 
    } 

    @Override 
    public Object getItem(int arg0) { 
     // TODO Auto-generated method stub 
     return lista.get(arg0); 
    } 

    @Override 
    public long getItemId(int arg0) { 
     // TODO Auto-generated method stub 
     return arg0; 
    } 

    @Override 
    public View getView(int arg0, View arg1, ViewGroup arg2) { 
     // TODO Auto-generated method stub 

     LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     View row = inflater.inflate(R.layout.fg, arg2, false); 

     Button b2 = (Button) row.findViewById(R.id.button1); 
     b2.setTag(arg0); 
     b2.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       int pos = (int)arg0.getTag(); 
        lista.remove(pos); 
        SunetePreferateAdaptor.this.notifyDataSetChanged();   } 
     }); 
     TextView titlu = (TextView) row.findViewById(R.id.textView1); 
     titlu.setText(lista.get(arg0).titlu); 
     titlu.setTextColor(Color.WHITE); 

     TextView descriere = (TextView) row.findViewById(R.id.textView2); 
     descriere.setText(lista.get(arg0).descriere); 


     return row; 
    } 
} 
+0

SunetePreferateAdaptor.this.notifyDataSetChanged(); machte den Trick – Roisgoen

+0

mit diesem ersten Artikel entfernt nur bestimmte Artikel. – NagarjunaReddy

+0

@NagarjunaReddy dann machst du es nicht richtig – Raghunandan

4

versuchen, diesen

b2.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      lista.remove(position); 
      SunetePreferateAdaptor.notifyDataSetChanged(); 
     } 
    }); 
+0

Aber ist es gut, meine Liste öffentlich zu deklarieren? –

+0

@Paul sollte es 'arg0' nicht' position' sein und da seine innere anonyme innere Klasse muss es 'final' sein oder du kannst tun, wie in meinem Beitrag vorgeschlagen – Raghunandan

+0

@Paul du musst auch diese' public void onClick (Zeige arg0) {'zu' public void onClick (Zeige v) {'coz hast du' public Zeige getView (int arg0, Ansicht arg1, ViewGroup arg2) {'der erste Parameter ist auch arg0 – Raghunandan

1

Sie es getan können von Ihrer Arraylist lista verwenden. Entfernen Sie zuerst das Element an der aktuellen Position und die Funktion "adapter.notifyDataSetChanged()".

1

Dieser Code für mich absolut in Ordnung ist.

public class CustomAdapter extends ArrayAdapter<String> 
{ 
Context c1; 
String s1[]; 
int s2[]; 
CustomAdapter(Context c,String s[],int s3[]) 
{ 
    super(c,R.layout.tcustom,s); 
    this.c1=c; 
    this.s1=s; 
    this.s2=s3; 
} 

public View getView(int position,View v,ViewGroup parent) 
{ 
    LayoutInflater li=(LayoutInflater) c1.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    v=li.inflate(R.layout.tcustom,null); 
    TextView tv=(TextView)v.findViewById(R.id.textView); 
    ImageView im=(ImageView)v.findViewById(R.id.imageview); 
    tv.setText(s1[position]); 
    im.setImageResource(s2[position]); 

    Button bt = (Button) v.findViewById(R.id.button); 
    bt.setTag(position); //important so we know which item to delete on button click 

    bt.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) 
     { 
      v.setVisibility(View.GONE); 
      notifyDataSetChanged(); 


      int positionToRemove = (int)v.getTag(); //get the position of the view to delete stored in the tag 
      removeItem(positionToRemove); //remove the item 
     } 
    }); 

    return v; 
} 

public void removeItem(int position){ 
    //convert array to ArrayList, delete item and convert back to array 
    ArrayList<String> a = new ArrayList<>(Arrays.asList(s1)); 
    a.remove(position); 
    String[] s = new String[a.size()]; 
    s=a.toArray(s); 
    s1 = s; 
    notifyDataSetChanged(); //refresh your listview based on new data 

} 
public int getCount() { 
    return s1.length; 
} 
public String getItem(int position) { 
return s1[position]; 
}}