【问题标题】:Adding A button and a TextView for each Line of a ListView为 ListView 的每一行添加一个按钮和一个 TextView
【发布时间】:2015-09-24 21:55:08
【问题描述】:

我目前正在开发一个非常基本的 android 应用程序,但遇到了一个我自己无法解决的障碍。

在我的应用程序中,我想要一个带有 ListView 的开始屏幕。在这个 ListView 的每一行中都应该有一个 Button 和一个 TextView。我想要大约 5 行。当您单击每个按钮时,您应该能够访问不同的活动。我怎么做?我读了一些关于适配器的东西,但我仍然不确定如何构建它。

这是我的 TextView 和 Button 的 xml 代码:

<RelativeLayout
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_below="@+id/textView"
    android:id="@+id/rl01">
    <TextView
        android:layout_width= "wrap_content"
        android:layout_height="50dp"
        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_width="wrap_content"
        android:layout_height="50dp"
        android:layout_toRightOf="@id/text01"
        android:text="Press Me!"
        />
</RelativeLayout>

【问题讨论】:

    标签: android listview button android-listview textview


    【解决方案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_width="fill_parent"
      android:layout_height="match_parent"
      android:orientation="vertical"
       >
         <ListView
              android:id="@+id/custom_list"
              android:longClickable="true"
              android:layout_width="fill_parent"
              android:layout_height="wrap_content"
         />
      
      
      
       </LinearLayout>
      

      list_row.xml

      <RelativeLayout
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/textView"
      android:id="@+id/rl01">
      <TextView
          android:layout_width= "wrap_content"
          android:layout_height="50dp"
          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;
      }
      

      【讨论】:

        猜你喜欢
        • 2017-09-29
        • 2022-01-06
        • 2021-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-26
        • 2018-07-11
        相关资源
        最近更新 更多