【问题标题】:ListView with Add and Delete Buttons in each Row in androidandroid中每行中带有添加和删除按钮的ListView
【发布时间】:2013-07-05 17:47:06
【问题描述】:

我正在开发一个 android 应用程序,在其中创建了一个 ListView。我必须在 ListView 中的每一行添加 2 个按钮。这两个按钮是添加和删除。当用户选择其中一个按钮时,应该采取一些行动。我该怎么做?

【问题讨论】:

  • 使用自定义listview布局,在item view中添加两个按钮,并在对应的点击事件上写action

标签: android android-listview add


【解决方案1】:

您首先需要创建一个自定义布局 xml,它将代表您列表中的单个项目。您将把您的两个按钮与您想要从列表中显示的任何其他项目一起添加到此布局中。

<?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>

接下来,您将需要创建一个自定义 ArrayAdapter 类,您将使用它来扩充您的 xml 布局,以及处理您的按钮和点击事件。

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

最后,在您的活动中,您可以实例化您的自定义 ArrayAdapter 类并将其设置为您的列表视图。

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

希望这会有所帮助!

【讨论】:

  • 如果我想使用 CursorLoader 怎么办?
  • return list.get(pos).getId();---无法解析方法'getId()'
  • @TahaKörkem 只需将“return list.get(pos).getId()”替换为“return 0”即可。如果您的列表项没有 Id 属性,则 getId() 方法没有用。
  • 谢谢,这很有帮助,但有一个小问题。我似乎无法在那些匿名类中使用位置变量,它说它必须是最终的。
  • 无法理解..我如何在按钮单击时开始一些操作,这不会与我的列表连接...所以我需要实际相同,但有一些不同。我需要开始下载文件,单击按钮并显示进度....完成后我需要将按钮升级到活动状态(或替换进度条)然后我将开始通过蓝牙将文件加载到我的设备。所以我需要发送的不仅仅是列表......因为布局类型取决于某个值(我需要数组 [int] [字符串],或者类似的东西,我想)......我是 Android 和 Java 的新手,所以这一切对我来说都很难)
【解决方案2】:

删除按钮点击事件

public void delete(View v){                

    ListView listview1;
    ArrayList<E> datalist;

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

}

【讨论】:

    【解决方案3】:
    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;
     }
    }
    

    嘿,请给look here-

    我的博客上有同样的答案..

    【讨论】:

    • 混乱存在。我的 ListView 准备好了。我只需要在每一行中添加两个按钮。我没有清楚地了解您的代码。
    • 只需像其他 textview 一样在 row_layout.xml 中放置两个按钮并使用它们的 id 调用它们。然后像 me-holder.btnDelete.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO 自动生成的方法 stub Log.i("Delete Button Clicked", "**********"); Toast.makeText(context, "Delete button Clicked", Toast.LENGTH_LONG).show(); } });
    • 好吧,我建议只是复制粘贴所有代码并制作一个演示应用程序,然后您就可以轻松理解代码的工作方式..
    • 现在我必须根据需要对我的 GUI 进行更改。我必须在列表视图的底部添加两个按钮。
    • 你对此有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 2017-07-20
    • 2015-08-12
    • 1970-01-01
    • 2021-03-12
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多