Listview多种布局的使用
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多种布局的使用的更多相关文章
- Android ListView Adapter的getItemViewType和getViewTypeCount多种布局
<Android ListView Adapter的getItemViewType和getViewTypeCount多种布局> 在Android的ListView中.假设在一个Lis ...
- Android开发之ListView添加多种布局效果演示
在这个案例中展示的新闻列表,使用到ListView控件,然后在适配器中添加多种布局效果,这里通过重写BaseAdapter类中的 getViewType()和getItemViewType()来做判断 ...
- android多种布局的列表实现
最近有一个列表效果,需要一个列表有多种布局,最终效果如下: 这个我也问了同事以及开发群里的朋友,居然都没得到最优的实现方式的回答,看来这种复杂列表的需求还是比较少的,我自己也走了一些弯路,把我几个实现 ...
- Android RecycleView多种布局实现(工厂模式)
RecycleView是个很常用的控件,很多APP中都可以看到它的身影,同时它也是个很难用的控件,主要就难在多种布局的实现. 在<第一行代码—Android>这本书里边有个RecycleV ...
- Android ListView多布局
使用listview多布局会出现一点问题: 由于多个item布局给单一的item布局是不一样的,使用起来,contentview的复用会出现问题. 避免出现问题的有这几个方法: 1.重写 getVie ...
- 2018-5-28-win10-uwp-动态修改ListView元素布局
title author date CreateTime categories win10 uwp 动态修改ListView元素布局 lindexi 2018-05-28 15:15:54 +0800 ...
- Android ListView中添加不同的多种布局
最近做项目要使用ListView加载不同的布局,由于自己写的代码不能贴出,故找了一篇自认为比较好的blog给分享出来,希望对用到此项技术的同学有点帮助. http://logc.at/2011/10/ ...
- Android ListView多布局讲解
Listview优化是一个老生常谈的事情了,其优化的方面也有很多种,例如,布局重用.在getView()中减少逻辑计算.减少在页面滑动的时候加在图片,而是在页面停止滚动的时候再加在图片.而今天要介绍的 ...
- Android中ListView错位布局实现(无聊向)
由于某些原因,需要个错位的页面,在网上找不到好的例子,试着动手写了写. 不考虑配色的完成图如下: 首先考虑的是,listview每一行左右都有可能缩进. 先假设一行的布局就是ImageView,Tex ...
随机推荐
- MongoDB小结19 - find【查询条件$all】
利用all来查询所以满足的匹配项,已知数据库有这些数据 db.user.find({},{"_id":0}) { "fruit" : [ "apple ...
- FTP Server完整篇 ubuntu 10.04
1. sudo apt-get install vsftpd #安裝FTP Server(vsftp:very secure FTP) 安装后,会自动生成ftp用户,和ftp的文件夹,如果没有自动 ...
- C# .NET如何清空stringbuilder
就红色的代码可以: System.Text.StringBuilder sb = new System.Text.StringBuilder(); sb.Append("hello&qu ...
- Python爬虫开发【第1篇】【代理】
1.简单的自定义opener() import urllib2 # 构建一个HTTPHandler 处理器对象,支持处理HTTP请求 http_handler = urllib2.HTTPHandle ...
- iOS CMSampleBuffer deep copy
extension CVPixelBuffer { func copy() -> CVPixelBuffer { precondition(CFGetTypeID(self) == CVPixe ...
- web 开发之js---JS变量也要注意初始化
原先以为js作为弱类型语言,变量的初始化没必要,但是: var text; text+="你好"; alert(text); 对话框弹出的内容是:"undefined你好 ...
- navicat软件设置连接mysql数据库
navicat软件设置连接mysql数据库 适用范围及演示使用工具 适用范围:mysql全部系列(含Linux和Windows系统下的mysql) 演示使用工具:Navicat 8.0 MySQL 演 ...
- Centos7 防火墙firewalld配置
开启80端口 firewall-cmd --zone=public --add-port=80/tcp --permanent 出现success表明添加成功 移除某个端口 firewall-cmd ...
- 【BZOJ 3211&3038】 花神游历各国 & 上帝造题的七分钟2
[题目链接] [BZOJ 3211] 点击打开链接 [BZOJ 3038] 点击打开链接 [算法] 线段树 开根操作直接开到叶子节点,注意当区间中所有数都是0或1时,不需要开根 [代码] #inclu ...
- 第十一周 Leetcode 576. Out of Boundary Paths (HARD) 计数dp
Leetcode 576 给定一个二维平面, 一个球在初始位置(i,j)每次可以转移到上下左右的一格. 问在N次转移内,有多少种路径可以转移出边境. dp[i][j][k]为 在点(i,j) 已经走了 ...