ListView定制不同的Item

一个listView中可能要显示不同风格的item,下面就来介绍一下怎样来实现。
先附上效果图
这里写图片描述

首先,自定义一个适配器
在adapter中必须实现这两个方法

 /**
     * @param position 用于判断加载哪种item 根据自己的需要来实现
     * @return
     */
    @Override
    public int getItemViewType(int position) {
        if (position == 0) {//是否是第一项
            return 0;
        } else if (position == 1) {//是否是第二项
            return 1;
        } else {
            return 2;
        }
    }

    /**
     * @return Item的种类 这里共三种,TYPE_COUNT==3;
     */
    @Override
    public int getViewTypeCount() {
        return TYPE_COUNT;
    }

然后在getView方法中调用getItemViewType(position)来判断加载哪种布局

@Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (getItemViewType(position) == 0) {/**加载第一种item**/
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = View.inflate(context, R.layout.list_item_one, null);
                viewHolder.firstText = (TextView) convertView.findViewById(R.id.tv_item_one);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.firstText.setText(arrayList.get(position).getFirstItem());
        } else if (getItemViewType(position) == 1) {/**加载第二种item**/
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = View.inflate(context, R.layout.list_item_two, null);
                viewHolder.secondTextTop = (TextView) convertView.findViewById(R.id.tv_item_two_top);
                viewHolder.secondTextBottom = (TextView) convertView.findViewById(R.id.tv_item_two_bottom);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.secondTextTop.setText(arrayList.get(position).getSecondItemTop());
            viewHolder.secondTextBottom.setText(arrayList.get(position).getSecondItemBottom());
        } else if (getItemViewType(position) == 2) {/**加载第三种item**/
            if (convertView == null) {
                viewHolder = new ViewHolder();
                convertView = View.inflate(context, R.layout.list_item_three, null);
                viewHolder.thirdText = (TextView) convertView.findViewById(R.id.tv_item_three);
                viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv_item_three);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.thirdText.setText(arrayList.get(position).getThirdItemText());
            viewHolder.imageView.setImageResource(arrayList.get(position).getThirdItemImg());
        }
        return convertView;
    }

三种item的布局文件比较简单,这里就不贴上来了。
接下来就是在activity中调用了

 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        listView = (ListView) findViewById(R.id.lv_main);
        initData();
        listView.setAdapter(new ListViewAdapter(this, arrayList));
    }

初始化数据:

 /**
     * 初始化数据
     * 根据自己的需要初始化数据,我这里把所有的item放在一个javabean里面,
     * 需要用哪个初始化哪个,我为了简单这样写的,但不建议这样写
     */
    private void initData() {
        arrayList = new ArrayList<>();
        arrayList.add(new ItemData("first item"));
        arrayList.add(new ItemData("second item top", "second item bottom"));
        arrayList.add(new ItemData("third item text1", R.mipmap.ic_launcher));
        arrayList.add(new ItemData("third item text2", R.mipmap.ic_launcher));
        arrayList.add(new ItemData("third item text3", R.mipmap.ic_launcher));
    }

好了,这样就基本上完成了。

源码下载

Android中的ListView是一个常用的控件,用于展示一系列可滚动的项目。定制ListView通常涉及自定义Adapter、ViewHolder、和布局文件。以下是定制ListView的基本步骤: 1. 自定义Adapter:创建一个继承自`BaseAdapter`或使用更现代的`RecyclerView.Adapter`的类。这个类负责管理数据源(List或Array),以及为每个列表项生成视图(convertView)。 ```java public class CustomListAdapter extends ArrayAdapter<Item> { // 数据源 private List<Item> items; // 布局资源ID private int layoutId; public CustomListAdapter(Context context, int layoutId, List<Item> items) { super(context, layoutId, items); this.items = items; this.layoutId = layoutId; } // 重写必要的方法,如getView()来返回自定义视图 } ``` 2. ViewHolder模式:为了提高性能,当列表滚动时,Adapter通常不会每次都重新创建列表项的视图。ViewHolder模式会预先加载一个完整的布局,然后根据需要复用。 ```java private class ViewHolder { TextView textView; ImageView imageView; // 添加更多视图变量... @NonNull public ViewHolder(@NonNull View itemView) { textView = itemView.findViewById(R.id.text_view); imageView = itemView.findViewById(R.id.image_view); // 初始化其他视图 } } ``` 3. 布局文件:创建一个XML文件,作为ListView中每个列表项的布局模板。在这个文件中,你可以添加任何你需要的视图件。 ```xml <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:id="@+id/text_view" android:layout_width="0dp" android:layout_weight="1" android:layout_height="wrap_content" /> <ImageView android:id="@+id/image_view" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值