2011-11-14 48 views
5

Trong ứng dụng tôi có một Listactivity trong đó có một adapter với TextView và Button (có nhãn xóa). Bây giờ tôi muốn loại bỏ mục Button được bấm tương ứng. vui lòng kiểm tra mã và đề xuất ???? `làm thế nào để setOnclickListener() trên nút bên trong ListView?

public class MySimpleArrayAdapter extends ArrayAdapter<String> implements OnClickListener { 
    private final Activity context; 
    private final String[] names; 
    private Button deleteButton= null; 
    public MySimpleArrayAdapter(Activity context, String[] names) { 
     super (context, R.layout.imagelistlayout, names); 
     this.context = context; 
     this.names = names; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.imagelistlayout, null, true); 
     deleteButton= (Button)rowView.findViewById(R.id.delete_bn); 
     deleteButton.setTag(position); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     textView.setText(names[position]); 
     deleteButton.setOnClickListener(this); 
     return rowView; 

    } 

    @Override 
    public void onClick(View convertView) { 
     System.out.println(deleteButton.getTag()); 

    } 

}` 

Tôi muốn biết cách xóa mục có nút được nhấp.

+0

http://stackoverflow.com/questions/1821871/android-how-to-fire-onlistitemclick-in-l istactivity-with-buttons-in-list –

+0

http://www.geekmind.net/2009/11/android-custom-list-item-with-nested.html –

Trả lời

8

chỉ xử lý trên nhấp chuột nghe bên getview nơi bạn tìm thấy nút sử dụng findviewbyid

này sẽ xử lý các nút hàng hiện tại nhấp

public class MySimpleArrayAdapter extends ArrayAdapter<String> implements OnClickListener { 
    private final Activity context; 
    private final String[] names; 
    private Button deleteButton= null; 
    public MySimpleArrayAdapter(Activity context, String[] names) { 
     super (context, R.layout.imagelistlayout, names); 
     this.context = context; 
     this.names = names; 

    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.imagelistlayout, null, true); 
     deleteButton= (Button)rowView.findViewById(R.id.delete_bn); 
     deleteButton.setTag(position); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     textView.setText(names[position]); 
     deleteButton.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 
       //try to hide textview or something it may help 
      } 
     }); 
     return rowView; 

    } 

}` 
0
deleteButton.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View arg0) { 
      Log.d("TAG", "position: " + position); 
     } 
    }); 

Và vị trí bạn cần phải thực hiện để cuối cùng trong getView (vị trí int cuối cùng, ..., ...) Khi bạn có vị trí, hãy làm bất cứ điều gì bạn muốn với nó! Xóa, sửa đổi hoặc bất cứ điều gì ..

+0

System.out.println (deleteButton.getTag()) ; Bằng cách này tôi nhận được giá trị cuối cùng của vị trí Giả sử tôi có ba mục trong danh sách của tôi giá trị của vị trí sẽ b 2. – Sandroid

+0

Không sử dụng thẻ, những gì bạn muốn là vị trí trong listview nơi bạn nhấp vào nút, phải không? Sau đó, bạn có vị trí trong getView. Nếu bạn muốn xóa hàng cụ thể đó, chỉ cần xóa nó khỏi danh sách bạn gửi trong adapter tại vị trí đó .. sau đó sử dụng yourAdapter.notifyDataSetChanged(); – Carnal

0

Rất đơn giản, bạn có biến int vị trí trong getView đề cập đến mục mà nút đã được thổi phồng để sử dụng biến vị trí để xóa mục mà bạn đã nhấp vào. Chỉ cần sử dụng mã dưới đây.

@Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = context.getLayoutInflater(); 
     View rowView = inflater.inflate(R.layout.imagelistlayout, null, true); 
     deleteButton= (Button)rowView.findViewById(R.id.delete_bn); 
     deleteButton.setTag(position); 
     TextView textView = (TextView) rowView.findViewById(R.id.label); 
     textView.setText(names[position]); 
     // deleteButton.setOnClickListener(this); 
deleteButton.setOnClickListener(new OnClickListener() 
     { 

      @Override 
      public void onClick(View arg0) { 
       // TODO Auto-generated method stub 
       //use position here 
          // delete the item from data string havng position index and the use notifydataset 
      } 

     }); 
     return rowView; 

    } 
9

Bạn nên cố gắng không mã hóa trình xử lý onClick của mình theo phương thức getView nhưng xem cách bạn chỉ định phương thức onClick cho chế độ xem danh sách. Ở đây bạn chỉ định phương thức từ hoạt động và đó là những gì bạn nên làm ở đây.

Trong bạn bị tiếp hợp tạo ra một phương pháp gọi là setOnXXXClickListener

public void setOnXXXClickListener(final OnClickListener onClickListener) { 
    this.onXXXClickListener = onClickListener; 
} 

và trong getView bạn gán này để nút như vậy

viewHolder.xxx.setOnClickListener(this.onXXXClickListener); 

Từ bạn Hoạt động sau đó bạn có thể gán các phương pháp onClick như

này
this.adapter.setOnXXXClickListener(new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d(TAG, "OnXXXClickListener"); 
    } 
}); 
+0

Câu trả lời tuyệt vời nếu bạn cần gọi một số chức năng không liên quan đến bộ điều hợp listview! – Leonardo

+0

Cách nhận vị trí bằng cách tiếp cận này? – Sumit

+0

Nếu bạn cần vị trí bạn có nhiều khả năng sẽ sử dụng setOnItemClickListener. Tuy nhiên bạn luôn có tùy chọn để setTag người dùng trên chế độ xem bạn chỉ định setOnXXXClickListener và sau đó trích xuất giá trị thẻ mà sau đó có thể là vị trí. – slott

Các vấn đề liên quan