2014-04-16 15 views
5

Tôi có chế độ xem danh sách tùy chỉnh, có 2 lượt xem văn bản và 2 nút (nút phát và xóa) Tôi muốn khi tôi nhấp vào nút xóa để xóa dòng hiện tại.Xóa mục khỏi chế độ xem danh sách tùy chỉnh trên nút nhấp

lớp adaptor My

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; 
    } 
} 

Vâng làm thế nào tôi có thể làm điều đó? tôi đã cố gắng làm cho ArrayList tĩnh và xóa các mục của nó trên nhấp chuột .. nhưng không thành công ..

Trả lời

8

Bạn không cần thực hiện ArrayList tĩnh.

Bạn cần phải xóa dữ liệu khỏi danh sách điền danh sách xem. Bạn gọi notifyDataSetChanged(); để làm mới lsitview.

Bạn có thể loại bỏ các từ khóa tĩnh và sử dụng

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:

Bạn có thể vượt qua danh sách để các nhà xây dựng của lớp adapter.

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));

Sau đó, có điều này trong một file java riêng

class ob { 
    String titlu, descriere; 

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

Sau đó

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(); thực hiện thủ thuật – Roisgoen

+0

bằng cách sử dụng mục đầu tiên này chỉ là loại bỏ mục không cụ thể. – NagarjunaReddy

+0

@NagarjunaReddy sau đó bạn không làm điều đó đúng – Raghunandan

4

thử này

b2.setOnClickListener(new OnClickListener() { 

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

Nhưng tốt khai báo danh sách của tôi là tĩnh công khai? –

+0

@Paul nó phải là 'arg0' không' vị trí' và kể từ bên trong của nó bên trong lớp học bên trong nó phải là 'final' hoặc bạn có thể làm như đề xuất trong bài của tôi – Raghunandan

+0

@Paul bạn cũng sẽ cần phải thay đổi 'public void onClick (Xem arg0) {'to' public void onClick (Xem v) {'coz bạn có' public view getView (int arg0, View arg1, ViewGroup arg2) {'tham số đầu tiên cũng là arg0 – Raghunandan

1

Bạn có thể thực hiện nó bằng cách sử dụng Lista ArrayList của bạn. Đầu tiên loại bỏ các mục ở vị trí hiện tại và các cuộc gọi adapter.notifyDataSetChanged() chức năng.

1

Mã này làm việc hoàn toàn tốt cho tôi.

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]; 
}} 
Các vấn đề liên quan