Android ListView中 每一项都有不同的布局

4 篇文章 0 订阅
1 篇文章 0 订阅

实现代码

Adapter的代码

其中:ViewHolder分别是三个不同的布局,也就是ListView中每一项的布局

TYPE_1...是三种类型.

在使用不同布局的时候,getItemViewType和getViewType不能少,一般是不用这两个函数的重载的

  1. class RunRankAdapter extends BaseAdapter {  
  2.     ArrayList<HashMap<String, Object>> ls;  
  3.     Context mContext;  
  4.     LinearLayout linearLayout = null;  
  5.     LayoutInflater inflater;  
  6.     TextView tex;  
  7.     final int VIEW_TYPE = 3;  
  8.     final int TYPE_1 = 0;  
  9.     final int TYPE_2 = 1;  
  10.     final int TYPE_3 = 2;  
  11.   
  12.     public RunRankAdapter(Context context,  
  13.             ArrayList<HashMap<String, Object>> list) {  
  14.         ls = list;  
  15.         mContext = context;  
  16.     }  
  17.   
  18.     @Override  
  19.     public int getCount() {  
  20.         return ls.size();  
  21.     }  
  22.   
  23.     @Override  
  24.     public Object getItem(int position) {  
  25.         return ls.get(position);  
  26.     }  
  27.   
  28.     @Override  
  29.     public long getItemId(int position) {  
  30.         return 0;  
  31.     }  
  32.   
  33.     // 每个convert view都会调用此方法,获得当前所需要的view样式  
  34.     @Override  
  35.     public int getItemViewType(int position) {  
  36.         int p = position;  
  37.         if (p == 0)  
  38.             return TYPE_1;  
  39.         else if (p == 1)  
  40.             return TYPE_2;  
  41.         else  
  42.             return TYPE_3;  
  43.     }  
  44.   
  45.     @Override  
  46.     public int getViewTypeCount() {  
  47.         return 3;  
  48.     }  
  49.   
  50.     @Override  
  51.     public View getView(int position, View convertView, ViewGroup parent) {  
  52.         ViewHolder1 holder1 = null;  
  53.         ViewHolder2 holder2 = null;  
  54.         ViewHolder3 holder3 = null;  
  55.         int type = getItemViewType(position);  
  56.         if (convertView == null) {  
  57.             inflater = LayoutInflater.from(mContext);  
  58.             // 按当前所需的样式,确定new的布局  
  59.             switch (type) {  
  60.             case TYPE_1:  
  61.   
  62.                 convertView = inflater.inflate(R.layout.item_runrank1,  
  63.                         parent, false);  
  64.                 holder1 = new ViewHolder1();  
  65.                 holder1.rank1 = (TextView) convertView  
  66.                         .findViewById(R.id.tv_list1_rank);  
  67.                 holder1.time1 = (TextView) convertView  
  68.                         .findViewById(R.id.tv_list1_time);  
  69.                 convertView.setTag(holder1);  
  70.                 break;  
  71.             case TYPE_2:  
  72.                 convertView = inflater.inflate(R.layout.item_runrank2,  
  73.                         parent, false);  
  74.                 holder2 = new ViewHolder2();  
  75.                 holder2.rank2 = (TextView) convertView  
  76.                         .findViewById(R.id.tv_list2_rank);  
  77.                 holder2.time2 = (TextView) convertView  
  78.                         .findViewById(R.id.tv_list2_time);  
  79.                 convertView.setTag(holder2);  
  80.                 break;  
  81.             case TYPE_3:  
  82.                 convertView = inflater.inflate(R.layout.item_runrank3,  
  83.                         parent, false);  
  84.                 holder3 = new ViewHolder3();  
  85.                 holder3.rank3 = (TextView) convertView  
  86.                         .findViewById(R.id.tv_list3_rank);  
  87.                 holder3.time3 = (TextView) convertView  
  88.                         .findViewById(R.id.tv_list3_time);  
  89.                 convertView.setTag(holder3);  
  90.                 break;  
  91.             default:  
  92.                 break;  
  93.             }  
  94.   
  95.         } else {  
  96.             switch (type) {  
  97.             case TYPE_1:  
  98.                 holder1 = (ViewHolder1) convertView.getTag();  
  99.                 break;  
  100.             case TYPE_2:  
  101.                 holder2 = (ViewHolder2) convertView.getTag();  
  102.                 break;  
  103.             case TYPE_3:  
  104.                 holder3 = (ViewHolder3) convertView.getTag();  
  105.                 break;  
  106.             }  
  107.         }  
  108.         // 设置资源  
  109.         switch (type) {  
  110.         case TYPE_1:  
  111.             holder1.rank1.setText("" + (position + 1));  
  112.             holder1.time1.setText(ls.get(position).get("time").toString());  
  113.             break;  
  114.         case TYPE_2:  
  115.             holder2.rank2.setText("" + (position + 1));  
  116.             holder2.time2.setText(ls.get(position).get("time").toString());  
  117.             holder2.totaldistance2.setText(ls.get(position)  
  118.             break;  
  119.         case TYPE_3:  
  120.             holder3.rank3.setText("" + (position + 1));  
  121.             holder3.time3.setText(ls.get(position).get("time").toString());  
  122.             break;  
  123.         }  
  124.   
  125.         return convertView;  
  126.     }  
  127.   
  128.     public class ViewHolder1 {  
  129.         TextView rank1;  
  130.         TextView time1;  
  131.     }  
  132.   
  133.     public class ViewHolder2 {  
  134.         TextView rank2;  
  135.         TextView time2;  
  136.     }  
  137.   
  138.     public class ViewHolder3 {  
  139.         TextView rank3;  
  140.         TextView time3;  
  141.     }  

使用方式:

声明并定义自己的Adapter,在ListView中设置他的Adapter

  1. private RunRankAdapter runRankAdapter;    
  2. ArrayList<HashMap<String, Object>> runRank;    
  3. ListView lv_runRank;  
  4. runRank = new ArrayList<HashMap<String, Object>>();    
  5. runRankAdapter = new RunRankAdapter(this, runRank);    
  6. lv_runRank = (ListView) findViewById(R.id.lv_runRank);    
  7. lv_runRank.setAdapter(runRankAdapter);  


还有一种方法:

在主布局文件中包含一个LinearLayout. 并且设置Android:orientation="vertical"
定义两种不同的布局文件,然后代码中,根据不同条件调用.addview向LinearLayout加载就可以了


需要注意的地方:adapter中的getViewTypeCount()方法一定要重载,返回值应该是不同布局的种类数



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 当使用ListView时,可以定义一个布局文件作为每个列表项的外观。以下是一个简单的例子: 首先,创建一个名为 `list_item.xml` 的新布局文件,它将包含一个ImageView和两个TextView布局如下: ```xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="wrap_content" android:padding="10dp"> <ImageView android:id="@+id/item_icon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/ic_launcher"/> <LinearLayout android:orientation="vertical" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" android:layout_marginStart="10dp"> <TextView android:id="@+id/item_title" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Item Title"/> <TextView android:id="@+id/item_description" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Item Description"/> </LinearLayout> </LinearLayout> ``` 在这个布局文件,我们定义了一个水平方向的LinearLayout,它包含一个ImageView和一个竖直方向的LinearLayout。竖直方向的LinearLayout包含两个TextView,分别用于显示标题和描述。我们还将LinearLayout的权重设置为1,这将使标题和描述填满空白区域。 接下来,将该布局文件用作ListView的每个列表项的布局。在ListView的适配器,可以通过以下方式使用该布局文件: ```java public class MyAdapter extends BaseAdapter { private List<Item> mItems; private Context mContext; public MyAdapter(Context context, List<Item> items) { mContext = context; mItems = items; } @Override public int getCount() { return mItems.size(); } @Override public Object getItem(int position) { return mItems.get(position); } @Override public long getItemId(int position) { return position; } @Override public View getView(int position, View convertView, ViewGroup parent) { View view = convertView; if (view == null) { LayoutInflater inflater = LayoutInflater.from(mContext); view = inflater.inflate(R.layout.list_item, parent, false); } Item item = mItems.get(position); ImageView icon = (ImageView) view.findViewById(R.id.item_icon); icon.setImageResource(item.getIcon()); TextView title = (TextView) view.findViewById(R.id.item_title); title.setText(item.getTitle()); TextView description = (TextView) view.findViewById(R.id.item_description); description.setText(item.getDescription()); return view; } } ``` 在适配器的getView()方法,我们获取要在该位置显示的Item对象,然后使用该对象的数据填充视图的ImageView和TextView。如果convertView为空,则使用LayoutInflater将列表项的布局文件转换为View对象。最后,返回填充数据的视图。 ### 回答2: 当然,我可以给您提供一个Android ListView布局例子。 首先,在您的布局文件,您需要添加一个ListView组件。例如,您可以在XML文件添加以下代码: ```xml <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent"/> ``` 接下来,在您的Activity或Fragment,您需要引用这个ListView,并为其设置适配器,以便显示数据。以下是一个简单的例子: ```java ListView listView = findViewById(R.id.listview); ArrayList<String> dataList = new ArrayList<>(); // 假设您有一个String数组作为数据源 String[] data = {"Apple", "Banana", "Cherry", "Durian", "Elderberry"}; // 将数据源添加到ArrayList Collections.addAll(dataList, data); // 创建适配器,并将数据源传递给它 ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, dataList); // 将适配器设置给ListView listView.setAdapter(adapter); ``` 以上例子,我们使用了Android提供的简单列表项布局(android.R.layout.simple_list_item_1)作为ListView的每个项的布局。 最后,在您的Activity或Fragment,您可以为ListView设置一个点击事件监听器,以响应用户对列表项的点击。例如,您可以使用以下代码: ```java listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 在这里处理用户点击列表项的逻辑 Toast.makeText(MainActivity.this, "You clicked " + dataList.get(position), Toast.LENGTH_SHORT).show(); } }); ``` 这个例子展示了如何创建一个简单的Android ListView布局,并为其设置适配器和点击事件监听器。您可以根据自己的需求,对ListView进行更多的自定义和修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值