ListView多条目加载

本文介绍了在Android开发中如何处理ListView加载不同类型数据的问题。通过在适配器内进行数据类型的判断,结合`getViewTypeCount()`和`getItemViewType(int position)`方法,实现对不同数据的区分和加载。示例代码展示了如何在`News.java`和`MainActivity.java`中操作,同时提供了`activity.xml`、`list_item0.xml`和`list_item1.xml`等布局文件的使用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这里写图片描述

在现实的项目开发中,listView往往会加载不同类型的数据,这就要求我们要对listView进行多条目的加载,对数据类型进行判断,怎么判断呢?主要在适配器里面进行类型的判断。

结构图:
这里写图片描述

先看一下布局文件:
activity.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.day9listviewmore.MainActivity" >

    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

list_item0.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.day9listviewmore.MainActivity" >

    <TextView 
        android:id="@+id/tv0"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />

</RelativeLayout>

list_item1.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.example.day9listviewmore.MainActivity" >

    <TextView 
        android:id="@+id/tv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
    <ImageView 
        android:id="@+id/iv1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/tv1"
        android:src="@drawable/ic_launcher"
        />

</RelativeLayout>

适配文件:

News.java:

public class News {
    int type; //10001:显示新闻   10002:显示广告   20001 20002
    String title;
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public News(int type, String title) {
        super();
        this.type = type;
        this.title = title;
    }
    @Override
    public String toString() {
        return "News [type=" + type + ", title=" + title + "]";
    }

}

主要代码如下:在listView适配器重写的四个方法的基础上,再手动重写两个方法,分别是:getViewTypeCount(),getItemViewType(int position),这两个方法,第一个是确定加载条木有几种数据类型,第二个是对数据进行判断和分类的。

MainActivity.java:

import java.util.ArrayList;
import java.util.List;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import com.example.day9listviewmore.bean.News;


public class MainActivity extends Activity {

    ListView lv;
    List<News> list;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView) findViewById(R.id.lv);
        initData();
        MyAdapter adapter = new MyAdapter();
        lv.setAdapter(adapter);
    }
    private void initData() {
        list = new ArrayList<News>();
        for (int i = 0; i < 100; i++) {
            News news;
            if(i%7 == 5){
                news = new News(10002, "广告" + i);
            }else{
                news = new News(10001, "正文标题" + i);
            }
            list.add(news);
        }
    }


    /**
     * 1、需要重写两个方法
     * 2、getViewTypeCount的返回值必须要大于getItemViewType的返回值
     * 3、对于返回的Type类型 通常定义成 静态常量来区分
     * @author Administrator
     *
     */
    class MyAdapter extends BaseAdapter{

        public static final int TYPE_ONE = 0;
        public static final int TYPE_TWO = 1;

        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return list.size();
        }


        //在使用多条目加载的时候    返回当前position对应的类型
        //************必须满足的条件   getItemViewType的返回值  必须要小于getViewTypeCount的返回值
        @Override
        public int getItemViewType(int position) {
            // TODO Auto-generated method stub
            if(list.get(position).getType() == 10001){
                return TYPE_ONE;
            }else{
                return TYPE_TWO;
            }
        }

        //使用多条目加载时   一共有几种类型
        //从写该方法后,listview控件会知道  当前的布局样式不止一种  
        //所以 当ListView发现convertview在复用时  类型不配不上时  会重写让convertView加载一遍布局
        @Override
        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            return 2;
        }



        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder0 holder0 = null;
            ViewHolder1 holder1 = null;

            int type = getItemViewType(position);

            if(convertView == null){
                if(type == TYPE_ONE){
                    convertView = View.inflate(MainActivity.this, R.layout.list_item0, null);
                    holder0 = new ViewHolder0();
                    holder0.tv0 = (TextView) convertView.findViewById(R.id.tv0);
                    convertView.setTag(holder0);
                }else{
                    convertView = View.inflate(MainActivity.this, R.layout.list_item1, null);
                    holder1 = new ViewHolder1();
                    holder1.tv1 = (TextView) convertView.findViewById(R.id.tv1);
                    convertView.setTag(holder1);
                }
            }else{
                if(type == TYPE_ONE){
                    holder0 = (ViewHolder0) convertView.getTag();
                }else{
                    holder1 = (ViewHolder1) convertView.getTag();
                }
            }
            //根据不同的情况  把进行赋值
            if(type == TYPE_ONE){
                holder0.tv0.setText(list.get(position).getTitle());
            }else{
                holder1.tv1.setText(list.get(position).getTitle());
            }
            return convertView;
        }

    }

    public static class ViewHolder0{
        TextView tv0;
    }

    public static class ViewHolder1{
        TextView tv1;
        ImageView iv1;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值