Listview加载不同布局

方法:

1.1.1 通过BaseAdapter的getViewTypeCount()获取Item种类数量,然后在getView()方法中根据不同的type设置不同的item布局 (操作麻烦,维护方便)

1.1.2 根据需求设置布局的显示隐藏效果 (操作方便,维护麻烦 )

下面展示第一种

主页面布局

<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"
    tools:context=".MainActivity" >

    <ListView
        android:id="@+id/lv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
       />

</RelativeLayout>

第一种item布局(只有文字)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/title"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="36sp"
        android:background="#f00"
        />

</LinearLayout>

第二种item布局 (图片加文字)红色为注重点

package com.ch.baseadapterdemo;

import java.util.ArrayList;

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

public class MainActivity extends Activity {
    private ListView lv;
    ArrayList<ItemB> bs = new ArrayList<ItemB>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        lv = (ListView) findViewById(R.id.lv);
        getData();
        lv.setAdapter(new MyAdapter());
    }

    public void getData(){
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz0", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz1", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz2", 0));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz3", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz4", 0));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz5", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz6", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz7", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz8", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz9", 0));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz10", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz11", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz13", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz14", 0));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz15", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz16", 0));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz17", 1));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz18", 0));
        bs.add(new ItemB(R.drawable.ic_launcher, "zzz19", 1));

    }

    class MyAdapter extends BaseAdapter{

          public static final int ITEM_TITLE = 0;
          public static final int ITEM_INTRODUCE = 1;
          LayoutInflater inflater = LayoutInflater.from(getApplicationContext());
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return bs.size();
        }

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

        @Override
        public int getItemViewType(int position) {
            // TODO Auto-generated method stub
            //判断依据
            return bs.get(position).getType();
        }

        @Override
        public int getViewTypeCount() {
            // TODO Auto-generated method stub
            //布局个数
            return 2;
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            // TODO Auto-generated method stub
            int type = getItemViewType(position);

            Holder1 holder1 = null;
            Holder2 holder2 = null;
            //优化
            if (convertView == null) {
                //选择某一个样式。。
                switch (type) {
                case ITEM_TITLE:
                  convertView = inflater.inflate(R.layout.item_title, null);
                  holder1 = new Holder1();
                  holder1.play_title = (TextView) convertView.findViewById(R.id.title);
                   //赋值
                  holder1.play_title.setText(bs.get(position).getName());

                  convertView.setTag(holder1);
                  break;
                case ITEM_INTRODUCE:
                  convertView = inflater.inflate(R.layout.item_children,null);
                  holder2 = new Holder2();
                  holder2.play_info = (TextView) convertView.findViewById(R.id.info);
                  holder2.play_img = (ImageView) convertView.findViewById(R.id.img);
                  //赋值
                  holder2.play_img.setBackgroundResource(bs.get(position).getImg());
                 holder2.play_info.setText(bs.get(position).getName());
                  convertView.setTag(holder2);
                  break;

                }
              } else {
                switch (type) {
                case ITEM_TITLE:
                  holder1 = (Holder1) convertView.getTag();
                  holder1.play_title.setText(bs.get(position).getName());
                  break;
                case ITEM_INTRODUCE:
                  holder2 = (Holder2) convertView.getTag();
                  holder2.play_info.setText(bs.get(position).getName());
                  holder2.play_img.setBackgroundResource(bs.get(position).getImg());
                  break;

                default:
                  break;
                }

              }

              return convertView;
        }

    }

    // 两个样式 两个holder。100就写100holder。。当然你何以把他抽离出来这里先只为了说明问题
      class Holder1 {
        TextView play_title;
      }

      class Holder2 {
        TextView play_info;
        ImageView play_img;
      }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }

}

vo

package com.ch.baseadapterdemo;

public class ItemB {
    private int img;
    private String name;
    private int type;
    public ItemB(int img, String name, int type) {
        super();
        this.img = img;
        this.name = name;
        this.type = type;
    }
    public int getImg() {
        return img;
    }
    public void setImg(int img) {
        this.img = img;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    

时间: 2024-10-17 03:07:04

Listview加载不同布局的相关文章

【Android笔记】listview加载性能优化及有多种listitem布局处理方式

在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容. 用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建. ListView加载数据都是在 1 public View getView(int position, View convertView, ViewGroup parent) { 2 3 ...... 4 5 }

一步一步实现listview加载的性能优化

listview加载的核心是其adapter,本文针对listview加载的性能优化就是对adpter的优化,总共分四个层次: 0.最原始的加载 1.利用convertView 2.利用ViewHolder 3.实现局部刷新 [转载请保留本文地址:http://www.cnblogs.com/goagent/p/5158064.html]  〇.最原始的加载 这里是不经任何优化的adapter,为了看起来方便,把listview的数据直接在构造函数里传给adapter了,代码如下: 1 priv

Android ListView加载更多

先看效果: ListView的footer布局: <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap

listView加载在Dialog里面

LinearLayout linearLayoutMain = new LinearLayout(this);// 自定义一个布局文件 linearLayoutMain.setLayoutParams(new LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT)); ListView listView = new ListView(this); listView.setFadingEdgeLength(0); Li

listview加载性能优化

在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局,但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建. ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}方法中进行的(要自定义listview都需

listview加载性能优化ViewHolder

在android开发中Listview是一个很重要的组件,它以列表的形式根据数据的长自适应展示具体内容,用户可以自由的定义listview每一列的布局, 但当listview有大量的数据需要加载的时候,会占据大量内存,影响性能,这时候就需要按需填充并重新使用view来减少对象的创建. ListView加载数据都是在public View getView(int position, View convertView, ViewGroup parent) {}方法中进行的(要自定义listview都

安卓开发笔记——ListView加载性能优化ViewHolder

在前不久做安卓项目的时候,其中有个功能是爬取某网站上的新闻信息,用ListView展示,虽然做了分页,但还是觉得达不到理想流畅效果. 上网查阅了些资料,发现一些挺不错的总结,这里记录下,便于复习. 当ListView有大量的数据需要加载的时候,会占据大量内存,影响性能. 经过测试,发现耗费大量资源是在ListView去加载布局文件的时候,也就是findViewById的时候,这时我们就该考虑如何复用这个布局文件对象,以减少对象的创建. ListView加载数据是在public View getV

Android如何在初始化的时候获取加载的布局的宽高

在自定义ListView中,需要将下拉刷新的View在初始化的时候设置padding隐藏起来,这时就要在初始化的时候获得要加载的布局View的高度. private View headView; headView = inflater.inflate(R.layout.header, null); 如果接下来调用: headView.getHeight(); headView.getMeasuredHeight(); 我们知道都会返回0,原因是getMeasuredHeight要在measure

Android listview 加载更多定位问题

我们用Android在做Listview加载更多数据时,如果每次都重新new Adapter的话,视图就会滑动到第一条. 后来我发现listview有一个方法可以获取最顶部时哪一个 int  position = mListView.getFirstVisiblePosition(); 这样就可以获取目前显示的第一行到底是多少条. 于是我有找到一个方法,加载更多数据后.我们设置一下他的选取位置,就不会有滚动到第一个条了 mListView.setSelection(position); 但是仔细