为 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的主要内容,如果未能解决你的问题,请参考以下文章

android中每行中带有添加和删除按钮的ListView

wpf listview问题。给listview的每一行都加个button,button绑定该行。

为 HTML 中的每一行添加删除和更新按钮

vb.net 点击按钮选中listview最后一行

ListView添加节点

如何在gridPanel中的每一行添加一个按钮