ListView中有两个可以用来让ListView可以在视图中显示多种布局的方法,分别是getItemType和getViewTypeCount

其中

getItemViewType返回的是有参数position所决定的的view的id     getViewTypeCount,顾名思义,就是返回不同布局的数目

接下来我们要做的就是在getView方法中根据不同的itemType来创建正确的convertView

话不多说,先上图

主要代码:

Activity

public class MainActivity extends Activity {

    @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
} private void initView() {
ListView listView = (ListView) findViewById(R.id.listview);
listView.setAdapter(new MySeparatorListAdapter(initData()));
} private List<ListData> initData() {
List<ListData> data = new ArrayList<MainActivity.ListData>();
for(int i = 0; i < 30; i ++)
data.add(new ListData("标题:" + i, "内容:" + i, "作者:" + i));
return data;
}
}

Adapter类

class MySeparatorListAdapter extends BaseAdapter {
private static final int TYPE_MAIN = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_COUNT = 2; private List<ListData> mData;
private LayoutInflater mInflater; private TreeSet mSeparatorsSet = new TreeSet(); public MySeparatorListAdapter(List<ListData> data) {
mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
mData = data;
setSeparator();
} @SuppressWarnings("unchecked")
private void setSeparator() {
int index = 0;
for(int i = 0, n = mData.size(); i < n; i ++) {
if(i % 3 == 0) {
//保存分界位置信息
mSeparatorsSet.add(i + index);
mData.add(i + index, new ListData("分界" + index, null, null));
index ++;
}
}
notifyDataSetChanged();
} @Override
public int getItemViewType(int position) {
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_MAIN;
} @Override
public int getViewTypeCount() {
return TYPE_COUNT;
} @Override
public int getCount() {
return mData.size();
} @Override
public long getItemId(int position) {
return position;
} @Override
public ListData getItem(int position) {
return mData.get(position);
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_MAIN:
convertView = mInflater.inflate(R.layout.music_hot_review_item, null);
holder.titleView = (TextView)convertView.findViewById(R.id.music_hot_review_musicname);
holder.contentView = (TextView)convertView.findViewById(R.id.music_hot_review_review);
holder.authorView = (TextView)convertView.findViewById(R.id.music_hot_review_username);
break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.separator_item, null);
holder.titleView = (TextView)convertView.findViewById(R.id.separetor_title);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
switch (type) {
case TYPE_MAIN:
holder.titleView.setText(mData.get(position).getTitle().toString());
holder.contentView.setText(mData.get(position).getContent().toString());
holder.authorView.setText(mData.get(position).getAuthor().toString());
break;
case TYPE_SEPARATOR:
holder.titleView.setText(mData.get(position).getTitle().toString());
break;
}
return convertView;
}
}

xml代码:

主要布局:music_hot_review_item.xml

<?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:background="@drawable/list_rect_selector"
android:orientation="vertical" > <RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent" > <ImageView
android:id="@+id/music_hot_review_imageview"
android:layout_width="70dp"
android:layout_height="70dp"
android:layout_marginLeft="5dp"
android:layout_marginTop="5dp"
android:scaleType="centerCrop"
android:src="@drawable/music_image_default" /> <TextView
android:id="@+id/music_hot_review_musicname"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_toRightOf="@id/music_hot_review_imageview"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="我好想你"
android:textColor="@color/font_color"
android:textSize="18sp" /> <TextView
android:id="@+id/music_hot_review_username"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/music_hot_review_musicname"
android:layout_marginLeft="13dp"
android:layout_marginTop="2dp"
android:layout_toRightOf="@id/music_hot_review_imageview"
android:text="居来提"
android:textColor="@color/font_color"
android:textSize="16sp" /> <TextView
android:id="@+id/music_hot_review_review"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/music_hot_review_username"
android:layout_marginLeft="13dp"
android:layout_marginRight="5dp"
android:layout_marginTop="2dp"
android:layout_toRightOf="@id/music_hot_review_imageview"
android:paddingBottom="10dp"
android:text="dsahdkasdh"
android:textColor="@color/font_color"
android:textSize="15sp" />
</RelativeLayout> </LinearLayout>

分界布局: separator_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="5dp" > <TextView
android:id="@+id/separetor_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:textSize="20sp"
android:textColor="@color/my_green"
android:text="分界"
/> </RelativeLayout>

Listview多种布局的使用的更多相关文章

  1. Android ListView Adapter的getItemViewType和getViewTypeCount多种布局

     <Android ListView Adapter的getItemViewType和getViewTypeCount多种布局> 在Android的ListView中.假设在一个Lis ...

  2. Android开发之ListView添加多种布局效果演示

    在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...

  3. android多种布局的列表实现

    最近有一个列表效果,需要一个列表有多种布局,最终效果如下: 这个我也问了同事以及开发群里的朋友,居然都没得到最优的实现方式的回答,看来这种复杂列表的需求还是比较少的,我自己也走了一些弯路,把我几个实现 ...

  4. Android RecycleView多种布局实现(工厂模式)

    RecycleView是个很常用的控件,很多APP中都可以看到它的身影,同时它也是个很难用的控件,主要就难在多种布局的实现. 在<第一行代码—Android>这本书里边有个RecycleV ...

  5. Android ListView多布局

    使用listview多布局会出现一点问题: 由于多个item布局给单一的item布局是不一样的,使用起来,contentview的复用会出现问题. 避免出现问题的有这几个方法: 1.重写 getVie ...

  6. 2018-5-28-win10-uwp-动态修改ListView元素布局

    title author date CreateTime categories win10 uwp 动态修改ListView元素布局 lindexi 2018-05-28 15:15:54 +0800 ...

  7. Android ListView中添加不同的多种布局

    最近做项目要使用ListView加载不同的布局,由于自己写的代码不能贴出,故找了一篇自认为比较好的blog给分享出来,希望对用到此项技术的同学有点帮助. http://logc.at/2011/10/ ...

  8. Android ListView多布局讲解

    Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用.在getView()中减少逻辑计算.减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片.而今天要介绍的 ...

  9. Android中ListView错位布局实现(无聊向)

    由于某些原因,需要个错位的页面,在网上找不到好的例子,试着动手写了写. 不考虑配色的完成图如下: 首先考虑的是,listview每一行左右都有可能缩进. 先假设一行的布局就是ImageView,Tex ...

随机推荐

  1. HashSet源码分析1

    import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SetTest { pu ...

  2. day4-hdfs的核心工作原理\写数据流程 \读数据流程

    namenode元数据管理要点 1.什么是元数据? hdfs的目录结构及每一个文件的块信息(块的id,块的副本数量,块的存放位置<datanode>) 2.元数据由谁负责管理? namen ...

  3. jQuery的DOM操作之捕获和设置

    .html()--获取或设置目标元素内的全部内容,包括html的标签及属性在内: .text()--仅获取或设置目标元素内的文本内容. .val()--获取输入框的值: .attr()--获取或设置目 ...

  4. js 获取文件本地路径

    1.代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF- ...

  5. android几个高速打包命令

    在MTK  android4.4 上,有几条命令能够高速打包system uaserdata bootimage,可提高效率. snod:这个命令是能够高速打包system.是不会运行android各 ...

  6. 【Struts2五】ValueStack以及ognl表达式二(经常使用标签)

    Ognl经常使用标签:   1.s:debug       假设把该标签放入到s:iterator中能够看到当前正在迭代的元素的状态    2.s:property       1.输出       ...

  7. MySQL测试代码

    MySQL测试代码 # 注释内容 -- 注释内容 -- 创建maizi数据库 CREATE DATABASE IF NOT EXISTS `maizi` DEFAULT CHARACTER SET ' ...

  8. Cocos2dx--开发环境搭建

    配置文档下载:http://pan.baidu.com/s/1rja8I 有些文件比較大的自己去下,这里列一下全部用到的文件 adt-bundle-windows-x86-20140321.zip a ...

  9. input title 悬浮值

    <!doctype html><html lang="en"> <head>  <meta charset="UTF-8&quo ...

  10. shell 爬虫 从日志分析到数据采集与分析

    [root@VM_61_158_centos ~]# curl http://ip.chinaz.com/220.112.233.179 |grep -e Whwtdhalf.*span.*span. ...