为 ListView 的每一行添加一个按钮和一个 TextView
Posted
技术标签:
【中文标题】为 ListView 的每一行添加一个按钮和一个 TextView【英文标题】:Adding A button and a TextView for each Line of a ListView 【发布时间】:2015-09-24 21:55:08 【问题描述】:我目前正在开发一个非常基本的 android 应用程序,但遇到了一个我自己无法解决的障碍。
在我的应用程序中,我想要一个带有 ListView 的开始屏幕。在这个 ListView 的每一行中都应该有一个 Button 和一个 TextView。我想要大约 5 行。当您单击每个按钮时,您应该能够访问不同的活动。我怎么做?我读了一些关于适配器的东西,但我仍然不确定如何构建它。
这是我的 TextView 和 Button 的 xml 代码:
<RelativeLayout
android:layout_
android:layout_
android:layout_below="@+id/textView"
android:id="@+id/rl01">
<TextView
android:layout_width= "wrap_content"
android:layout_
android:id="@+id/text01"
android:text="hello"
android:textSize="24dp"
android:textColor="@color/abc_search_url_text_normal"
android:paddingRight="@dimen/activity_horizontal_margin"
/>
<Button
android:layout_
android:layout_
android:layout_toRightOf="@id/text01"
android:text="Press Me!"
/>
</RelativeLayout>
【问题讨论】:
【参考方案1】:您发布的 xml 布局将用作每个列表视图项。
第 1 步: 创建一个扩展 BaseAdapter 的类;
public class CustomAdapter extends BaseAdapter
Context con;
String[] data;
public CustomAdapter (Context context, String[] data)
this.con = context;
this.data = data;
@Override
public int getCount()
return data.length;
@Override
public Object getItem(int position)
return data[position];
@Override
public long getItemId(int position)
return 0;
//this method will be called for every item of your listview
@Override
public View getView(int position, View convertView, ViewGroup parent)
LayoutInflater inflater = (LayoutInflater) con.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView= inflater.inflate(R.layout.customview, parent, false);
TextView text = (TextView) view.findViewById(your text view id); //recognize your view like this
text.setText(data[position]);
return convertView;
第 2 步: 在您的活动中,识别您的列表视图:
yourListViewReference = (ListView) findViewById(R.id.your_list_view_id);
并初始化String数组:
String[] data = "item 1", "item2", "item3"; //how many items you want
然后创建您创建的自定义适配器的实例,并将其设置为 listview:
CustomAdapter ad = new CustomAdapter(this, data);
yourListViewReference.setAdapter(ad);
对不起,我的英语不好。我实际上正在努力。
【讨论】:
好答案!我只是使用 convertView 来避免每次都膨胀视图。 但我在某处读到它每次都会膨胀。我忘记了链接。我会再次交叉检查。感谢您提供这些有用的信息。 非常感谢 Khushal :)【参考方案2】:这个来自 Vogella 的 article 对您想做的事情非常有用。
基本上,您将创建一个扩展 BaseAdapter 类的适配器,如下所示:
public class Adapter extends BaseAdapter
private List<Item> mItems;
private Context mContext;
public EventAdapter(Context context, List<Event> items)
mContext = context;
mItems = items;
public View getView(int position, View convertView, ViewGroup parent)
// This recycles your view and prevents constant inflation, which can really hit your performance.
View rowView = convertView;
if (rowView == null)
ViewHolder viewHolder = new ViewHolder();
rowView = inflater.inflate(R.layout.yourLayout, parent, false);
viewHolder.text = (TextView) rowView.findViewById(R.id.yourTextViewId);
viewHolder.button = (Button) rowView.findViewById(R.id.yourButtonId);
rowView.setTag(viewHolder);
ViewHolder holder = (ViewHolder) rowView.getTag();
// Get the correct item by position
Item item = item.get(position);
// Update the row layout with your item data
holder.text.setText(item.text);
holder.button.setButton(item.button);
// Return your row view
return rowView;
@Override
public int getCount()
return mItems.size();
@Override
public Object getItem(int position)
@Override
public long getItemId(int position)
static class ViewHolder
public TextView text;
public Button button;
之后,您只需将此适配器设置为您的 ListView 或 RecyclerView
listView.setAdapter(new Adapter(this, items));
【讨论】:
【参考方案3】:我会写一个简单的例子:
列表视图行中不需要按钮,只需实现 onItemClick();
main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_
android:layout_
android:orientation="vertical"
>
<ListView
android:id="@+id/custom_list"
android:longClickable="true"
android:layout_
android:layout_
/>
</LinearLayout>
list_row.xml
<RelativeLayout
android:layout_
android:layout_
android:layout_below="@+id/textView"
android:id="@+id/rl01">
<TextView
android:layout_width= "wrap_content"
android:layout_
android:id="@+id/text01"
android:text="hello"
android:textSize="24dp"
android:textColor="@color/abc_search_url_text_normal"
android:paddingRight="@dimen/activity_horizontal_margin"
/>
MainActivity.java
oncreate()
....
lv1 = (ListView) result.findViewById(R.id.custom_list);
String[] listdata = "txt1", "txt2", "txt3", "txt4", "txt5";
ListAdapter listAdapt = new ListAdapter(this, listdata );
lv1.setAdapter(listAdapt);
lv1.setOnItemClickListener(new AdapterView.OnItemClickListener()
@Override
public void onItemClick(AdapterView<?> a, View v, int position, long id)
//do ur work here when list row selected
);
..
ListAdapter.java
public class ListAdapter extends BaseAdapter
String[] listData;
private LayoutInflater layoutInflater;
public CustomListAdapter(Context aContext, String[] listData)
this.listData = listData;
layoutInflater = LayoutInflater.from(aContext);
@Override
public int getCount()
return listData.size();
@Override
public Object getItem(int position)
return listData.get(position);
@Override
public long getItemId(int position)
return position;
public View getView(int position, View convertView, ViewGroup parent)
if (convertView == null)
convertView = layoutInflater.inflate(R.layout.list_row, null);
TextView tv1 = (TextView)convertView.findViewById(R.id.text01);
tv1.setText(listData.[position]);
return convertView;
【讨论】:
以上是关于为 ListView 的每一行添加一个按钮和一个 TextView的主要内容,如果未能解决你的问题,请参考以下文章