2013-07-08 56 views
24

Tôi đang phát triển một ứng dụng Android mà tôi đã tạo một ListView. Tôi phải thêm 2 nút với mỗi hàng trong ListView. 2 nút này là Thêm và Xóa. Khi người dùng chọn một trong các nút thì một số hành động sẽ được thực hiện. Tôi làm nó như thế nào?ListView với nút Thêm và Xóa trong mỗi Hàng trong android

+1

Sử dụng bố cục chế độ xem danh sách tùy chỉnh, Thêm hai nút trong chế độ xem mục và ghi hành động vào sự kiện nhấp tương ứng – OMAK

Trả lời

10
public class UserCustomAdapter extends ArrayAdapter<User> { 
Context context; 
int layoutResourceId; 
ArrayList<User> data = new ArrayList<User>(); 

public UserCustomAdapter(Context context, int layoutResourceId, 
    ArrayList<User> data) { 
    super(context, layoutResourceId, data); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 
    this.data = data; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    UserHolder holder = null; 

    if (row == null) { 
    LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
    row = inflater.inflate(layoutResourceId, parent, false); 
    holder = new UserHolder(); 
    holder.textName = (TextView) row.findViewById(R.id.textView1); 
    holder.textAddress = (TextView) row.findViewById(R.id.textView2); 
    holder.textLocation = (TextView) row.findViewById(R.id.textView3); 
    holder.btnEdit = (Button) row.findViewById(R.id.button1); 
    holder.btnDelete = (Button) row.findViewById(R.id.button2); 
    row.setTag(holder); 
    } else { 
    holder = (UserHolder) row.getTag(); 
    } 
    User user = data.get(position); 
    holder.textName.setText(user.getName()); 
    holder.textAddress.setText(user.getAddress()); 
    holder.textLocation.setText(user.getLocation()); 
    holder.btnEdit.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Log.i("Edit Button Clicked", "**********"); 
    Toast.makeText(context, "Edit button Clicked", 
     Toast.LENGTH_LONG).show(); 
    } 
    }); 
    holder.btnDelete.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
    // TODO Auto-generated method stub 
    Log.i("Delete Button Clicked", "**********"); 
    Toast.makeText(context, "Delete button Clicked", 
     Toast.LENGTH_LONG).show(); 
    } 
    }); 
    return row; 

} 

static class UserHolder { 
    TextView textName; 
    TextView textAddress; 
    TextView textLocation; 
    Button btnEdit; 
    Button btnDelete; 
} 
} 

Hey Hãy có một look here-

Tôi có cùng một câu trả lời ở đây trên blog của tôi ..

+0

Sự nhầm lẫn là có. My ListView đã sẵn sàng. Tôi chỉ cần thêm hai nút trong mỗi hàng. Tôi không nhận được mã của bạn rõ ràng. –

+1

chỉ cần đặt hai nút trong row_layout.xml của bạn như TextView khác và gọi cho họ với id của họ .. Và thiết listner onclick như ME holder.btnDelete.setOnClickListener (new OnClickListener() { @ Override public void onClick (Xem v) { // TODO Phương thức tạo tự động được tạo Log.i ("Xóa nút đã nhấp", "**********"); Toast.makeText (ngữ cảnh ", nút Xóa được nhấp" , Toast.LENGTH_LONG) .show(); } }); –

+0

Tôi cũng đề nghị chỉ cần sao chép dán tất cả các mã và làm cho một ứng dụng demo sau đó bạn có thể dễ dàng hiểu được làm việc của mã .. –

12

vào nút delete sự kiện click

public void delete(View v){     

    ListView listview1; 
    ArrayList<E> datalist; 

    final int position = listview1.getPositionForView((View) v.getParent()); 
    datalist.remove(position); 
    myAdapter.notifyDataSetChanged(); 

} 
70

Trước tiên, bạn sẽ cần phải tạo ra một tùy chỉnh bố cục xml sẽ đại diện cho một mục duy nhất trong danh sách của bạn. Bạn sẽ thêm hai nút của mình vào bố cục này cùng với bất kỳ mục nào khác mà bạn muốn hiển thị từ danh sách của mình.

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" > 

<TextView 
    android:id="@+id/list_item_string" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_centerVertical="true" 
    android:layout_alignParentLeft="true" 
    android:paddingLeft="8dp" 
    android:textSize="18sp" 
    android:textStyle="bold" /> 

<Button 
    android:id="@+id/delete_btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_alignParentRight="true" 
    android:layout_centerVertical="true" 
    android:layout_marginRight="5dp" 
    android:text="Delete" /> 

<Button 
    android:id="@+id/add_btn" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_toLeftOf="@id/delete_btn" 
    android:layout_centerVertical="true" 
    android:layout_marginRight="10dp" 
    android:text="Add" /> 

</RelativeLayout> 

Tiếp theo, bạn sẽ cần tạo Lớp tùy chỉnh ArrayAdapter mà bạn sẽ sử dụng để tăng bố cục xml, cũng như xử lý các nút và các sự kiện nhấp chuột.

public class MyCustomAdapter extends BaseAdapter implements ListAdapter { 
private ArrayList<String> list = new ArrayList<String>(); 
private Context context; 



public MyCustomAdapter(ArrayList<String> list, Context context) { 
    this.list = list; 
    this.context = context; 
} 

@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public Object getItem(int pos) { 
    return list.get(pos); 
} 

@Override 
public long getItemId(int pos) { 
    return list.get(pos).getId(); 
    //just return 0 if your list items do not have an Id variable. 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (view == null) { 
     LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inflater.inflate(R.layout.my_custom_list_layout, null); 
    } 

    //Handle TextView and display string from your list 
    TextView listItemText = (TextView)view.findViewById(R.id.list_item_string); 
    listItemText.setText(list.get(position)); 

    //Handle buttons and add onClickListeners 
    Button deleteBtn = (Button)view.findViewById(R.id.delete_btn); 
    Button addBtn = (Button)view.findViewById(R.id.add_btn); 

    deleteBtn.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      //do something 
      list.remove(position); //or some other task 
      notifyDataSetChanged(); 
     } 
    }); 
    addBtn.setOnClickListener(new View.OnClickListener(){ 
     @Override 
     public void onClick(View v) { 
      //do something 
      notifyDataSetChanged(); 
     } 
    }); 

    return view; 
} 
} 

Cuối cùng, trong hoạt động của bạn, bạn có thể khởi tạo lớp ArrayAdapter tùy chỉnh và đặt nó vào chế độ xem danh sách.

public class MyActivity extends Activity { 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_my_activity); 

    //generate list 
    ArrayList<String> list = new ArrayList<String>(); 
    list.add("item1"); 
    list.add("item2"); 

    //instantiate custom adapter 
    MyCustomAdapter adapter = new MyCustomAdapter(list, this); 

    //handle listview and assign adapter 
    ListView lView = (ListView)findViewById(R.id.my_listview); 
    lView.setAdapter(adapter); 
} 

Hy vọng điều này sẽ hữu ích!

+0

Nếu tôi muốn sử dụng CursorLoader thì sao? –

+2

return list.get (pos) .getId(); --- Không thể giải quyết phương thức 'getId()' –

+2

@ TahaKörkem chỉ cần thay thế "return list.get (pos) .getId()" bằng "return 0". Phương thức getId() không hữu ích nếu các mục trong danh sách của bạn không có thuộc tính Id. – adam83

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