【问题标题】:How to add button on each row in ListView?如何在 ListView 的每一行上添加按钮?
【发布时间】:2018-07-11 19:24:30
【问题描述】:

我正在尝试在 ListView 中的每一行上实现按钮,但我看到了很多主题,但我没有成功向我的添加代码。这是我的 MainActivity :

public class MainActivity extends AppCompatActivity {

private ArrayAdapter<String> itemsAdapter;
private ArrayList<String> items;
private ImageButton formButton;
private ListView lvMain;

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

public void commonFunction() {
    lvMain = (ListView) findViewById(R.id.lvMain);
    items = new ArrayList<String>();
    readItems();
    itemsAdapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1,
            items);
    lvMain.setAdapter(itemsAdapter);
    formButton = (ImageButton) findViewById(R.id.btnPlus);
    formButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            setLayoutActivity();
        }
    });
}
}

这是我的 activity_main.xml :

<ListView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/lvMain"
    android:layout_above="@+id/btnPlus" />

<ImageButton
    android:layout_width="match_parent"
    android:layout_height="65dp"
    android:id="@+id/btnPlus"
    android:layout_alignParentBottom="true"
    app:srcCompat="@mipmap/ic_plus_foreground" />

有人知道怎么做吗?

【问题讨论】:

  • 为 ListView 中所需的每种类型的行创建一个单独的 XML,然后在 ListAdapter 中从该 XML 布局文件创建行。您需要一个用于自定义行的自定义适配器。
  • 您需要带有自定义 xml 行的自定义适配器。你不能用 new ArrayAdapter(this, android.R.layout.simple_list_item_1, items);
  • 首先我建议你使用RecyclerView :) 创建一个自定义适配器和@Override getItemViewType() 然后你将根据返回的每个视图处理它;) 我可以举一个例子如果您决定进行此实施
  • 使用按钮创建 h 自定义 Listview,使用此 stackoverflow.com/questions/15832335/…
  • 你必须使用自定义适配器和自定义 row_item 布局

标签: java android listview


【解决方案1】:

使用自定义行布局文件创建自定义适配器并在该行文件上添加按钮并将其绑定到 List/Recycler 视图。所以它会在所有行中膨胀。

在 row_list.xml 文件中添加以下代码。

<ImageButton
android:layout_width="match_parent"
android:layout_height="65dp"
android:id="@+id/btnPlus"
android:layout_alignParentBottom="true"
app:srcCompat="@mipmap/ic_plus_foreground" />

CustomAdapter.java

public class CustomAdapter extends BaseAdapter {

private ArrayList data;
private static LayoutInflater inflater = null;


/*************  CustomAdapter Constructor *****************/
public CustomAdapter(ArrayList d) {

    /********** Take passed values **********/
    data = d;

    /***********  Layout inflater to call external xml layout () ***********/
    inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

}

/******** What is the size of Passed Arraylist Size ************/
public int getCount() {

    if (data.size() <= 0)
        return 1;
    return data.size();
}

public Object getItem(int position) {
    return position;
}

public long getItemId(int position) {
    return position;
}

/********* Create a holder Class to contain inflated xml file elements *********/
public static class ViewHolder {
    public ImageButton button;

}

/****** Depends upon data size called for each row , Create each ListView row *****/
public View getView(int position, View convertView, ViewGroup parent) {

    View vi = convertView;
    ViewHolder holder;

    if (convertView == null) {

        /****** Inflate tabitem.xml file for each row ( Defined below ) *******/
        vi = inflater.inflate(R.layout.row_list, null);

        /****** View Holder Object to contain tabitem.xml file elements ******/

        holder = new ViewHolder();
        holder.button = (ImageView) vi.findViewById(R.id.btnPlus);

        /************  Set holder with LayoutInflater ************/
        vi.setTag(holder);
    } else
        holder = (ViewHolder) vi.getTag();

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //Button click
        }
    });
    return vi;
}}

希望它能解决问题。

编码愉快!!

【讨论】:

  • 我认为 存在问题,IDE 无法识别 ,如果我添加所有这些代码,我必须在代码中的哪里初始化 CustomAdapter?再次感谢您的帮助。
【解决方案2】:

创建自定义适配器并将其与 ListView 绑定。 为适配器中的每一行扩展自定义布局。 您可以将按钮放在自定义布局文件中。

public class CustomAdapter extends ArrayAdapter<String> {

private Context context;

private int singleRowLayoutId;

public CustomAdapter(Context context, int singleRowLayoutId, String []titles, String []desc, int []images ) {
    super(context, singleRowLayoutId,titles);
    this.context=context;
    this.singleRowLayoutId=singleRowLayoutId; //custom row layout for list view item
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {

    View row=convertView;
    CustomViewHolder holder=null;
    if(row==null) {
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //view object of single row of list view
        row = inflater.inflate(singleRowLayoutId, parent, false);
        //by using holder, we make sure that findViewById() is not called every time.
        holder=new CustomViewHolder(row);
        row.setTag(holder);
    }
    else
    {
        holder=(CustomViewHolder)row.getTag();
    }

    return row;
}

private class CustomViewHolder {
    private ImageButton mbtn;

    CustomViewHolder(View view)
    {
        mbtn=(ImageButton)view.findViewById(R.id.btn);

        mbtn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            //handle button click here
        }
    });
    }
}

【讨论】:

  • 使用 ViewHolder 来提高 ListView 的性能,这样 findViewById() 只会在第一次被调用。
【解决方案3】:

我认为这就是您所需要的 - 为列表视图中的行创建单独的布局。然后创建一个自定义适配器,在其中将此布局添加为行布局,然后将此适配器设置为您的列表视图。以下是带有示例的详细信息:

Android custom Row Item for ListView

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 2014-04-23
    • 2015-06-26
    • 2015-09-24
    • 2014-10-23
    • 2012-05-04
    • 2021-01-16
    • 1970-01-01
    相关资源
    最近更新 更多