自定义SectionAdapter显示数据

转载请注明转自:noyet12的博客

博客原址:http://blog.csdn.net/u012975705/article/details/50238269

源码下载csdn

源码下载github

前言

之前在项目中需要在一个ScrollView中显示2个不同类型的列表,因为就2个列表,所以偷了下懒:直接使用的2个ListView来显示。写完之后怎么看怎么别扭,今天抽空学习写了个SectionAdapter,mark下。

实现效果

主要代码

package com.noyet.zzj.sectionadapterdemo;

import android.content.Context;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

/**
 * package: com.noyet.zzj.sectionadapterdemo
 * Created by noyet on 2015/12/9.
 */
public class SectionAdapter extends SectionBaseAdapter<SectionItem> {

    public SectionAdapter(Context context, SparseArray<SectionItem> mSectionItems) {
        super(context, mSectionItems);
    }

    @Override
    public int getItemViewType(int position) {
        int titlePos = 0;
        for (int i = 0; i < mTypeCount; i++) {
            SectionItem sectionItem = getItemSection(titlePos);
            int size = sectionItem.getCount() + 1;

            if (position < size) {
                return position;
            }
            position -= size;
            titlePos++;
        }
        return -1;
    }

    @Override
    public int getViewTypeCount() {
        return mTypeCount;
    }

    @Override
    public int getCount() {
        int total = 0;
        for (int i = 0; i < mTypeCount; i++) {
            total += getItemSection(i).getCount() + 1;
        }
        return total;
    }

    @Override
    public Object getItem(int position) {
        int titlePos = 0;
        for (int i = 0; i < mTypeCount; i++) {

            SectionItem sectionItem = getItemSection(titlePos);
            int size = sectionItem.getCount() + 1;
            if (position < size) {
                return sectionItem;
            }
            position -= size;
            titlePos++;
        }
        return null;
    }

    @Override
    public long getItemId(int position) {
        return (long) position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        SectionItem item = (SectionItem) getItem(position);
        int itemPos = getItemViewType(position);
        ViewHolder holder;

        if (itemPos == TYPE_SECTION_HEADER) {
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item_title_section, null);
                holder = new ViewHolder();
                holder.textView = (TextView) convertView.findViewById(R.id.text_title);
                holder.imageView = (ImageView) convertView.findViewById(R.id.text_title_iv);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.imageView.setImageResource(android.R.drawable.ic_dialog_dialer);
            holder.textView.setText(item.getTitle());
            return convertView;
        } else {
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item_content_section, null);
                holder = new ViewHolder();
                holder.textView = (TextView) convertView.findViewById(R.id.text_content);
                convertView.setTag(R.id.tag_data, holder);
            } else {
                holder = (ViewHolder) convertView.getTag(R.id.tag_data);
            }
            String content = item.getItem(itemPos - 1).toString();
            holder.textView.setText(content);
            convertView.setTag(R.id.tag_id, content);
            convertView.setOnClickListener(listener);
            return convertView;
        }
    }

    private View.OnClickListener listener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(mContext, (String) v.getTag(R.id.tag_id), Toast.LENGTH_SHORT).show();
        }
    };

    static class ViewHolder {
        TextView textView;
        ImageView imageView;
    }
}
package com.noyet.zzj.sectionadapterdemo;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.SparseArray;
import android.widget.ListView;

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

public class MainActivity extends AppCompatActivity {

    private SectionAdapter mAdapter;
    private SparseArray<SectionItem> mSectionItems;
    private List<String> list;
    private ListView mListView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        mListView = (ListView) findViewById(R.id.list_view);

        mSectionItems = new SparseArray<>();
        list = new ArrayList<>();
        list.add("like me 1");
        list.add("like me 2");
        list.add("like me 3");
        for (int i = 0; i < 10; i++) {
            SectionItem<String> sectionItem = new SectionItem<>(this, "title" + i, list);
            mSectionItems.put(i, sectionItem);
        }
        mAdapter = new SectionAdapter(this, mSectionItems);
        mListView.setAdapter(mAdapter);
    }
}
时间: 2024-10-24 23:29:11

自定义SectionAdapter显示数据的相关文章

[转]ASP.net MVC 2 自定义模板来显示数据

本文转自:http://blog.163.com/[email protected]/blog/static/1394892972012113104653651/ 在ASP.net MVC 2中,一个很有意思,也很实用的功能,就是可以模板化地显示数据模型.什么叫模板化地显示数据模型呢?MVC可以指定某种数据类型在视图中呈现时,以何种形式来进行呈现.一般情况下,MVC框架会将模型中和各个字段以字符串的形式进行渲染,所以,我们看到的就是字符串.然而,我们有了模板化帮助器,我们可以更加自由地来装饰我们

《连载 | 物联网框架ServerSuperIO教程》- 13.自定义视图显示接口开发,满足不同的显示需求

1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架ServerSuperIO教程>2.服务实例的配置参数说明 <连载 | 物联网框架ServerSuperIO教程>- 3.设备驱动介绍 <连载 | 物联网框架ServerSuperIO教程>-4.如开发一套设备驱动,同时支持串口和网络通讯. <连载 | 物联网框架ServerSupe

WinForm自定义ListBox显示样式

WinForm自定义ListBox显示样式,多列分不同颜色显示,效果如下图: 首先向winForm窗口拖入一个ListBox控件,命名为lstConsole,同时将DrawMode设置为:OwnerDrawFixed,这里一定要注意否则我们接下来的工作都不会起作用. 然后我们来自定义ListBoxItem,代码如下: public class ColoredListBoxItem { /// <summary> /// creates a new ColoredListBoxItem ///

LigerUI之Grid使用详解(一)——显示数据 --分页

http://www.cnblogs.com/jerehedu/p/4218560.html 首先给大家介绍最常用的数据展示组件Grid,使用步骤如下: 1.页面中正确引入样式文件及相应组件 <link href="<%=request.getContextPath()%>/ui/lib/ligerUI/skins/Aqua/css/ligerui-all.css" rel="stylesheet" type="text/css"

python Django教程 之 模型(数据库)、自定义Field、数据表更改、QuerySet API

python  Django教程  之 模型(数据库).自定义Field.数据表更改.QuerySet API 一.Django 模型(数据库) Django 模型是与数据库相关的,与数据库相关的代码一般写在 models.py 中,Django 支持 sqlite3, MySQL, PostgreSQL等数据库,只需要在settings.py中配置即可,不用更改models.py中的代码,丰富的API极大的方便了使用. 本节的代码:(Django 1.6, Python 2.7 测试环境) 大

自定义UITableView显示不全

我在开发过程中,遇到了自定义UITableView显示不全的情况,有两行cell始终拉不到底部.估计是我自定义cell时改变了cell的高导致的.我的解决办法是让UITableView多显示两行.下面的数组_allAlarmArray是数据源.在UITableView的协议函数中返回几行的函数. - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ return [_al

django中的admin组件之自定义组件的数据展示以及自定义列

虽然我们基本实现了我们自定义组件stark的功能,接下来就是显示数据了. 今天我们先来写查.先来写表单部分 我们如果需要显示我们自己配置类中的字段,应该怎么做呢? 我们有这样一个想法,将这些数据放在一个列表中,类似这样[['python',122],['linux',110]],然后在页面上依次循环这个列表,取值就行了. self.model.objects.all()中里面有我们需要的对象,self.list_display中有我们需要的字段.所以: def listview(self,req

利用PHP实现登录与注册功能以及使用PHP读取mysql数据库——以表格形式显示数据

登录界面 <body><form action="login1.php" method="post"><div>用户名:<input type="text" name="uid" /></div><br /><div>密码:<input type="password" name="pwd" />

自定义进阶2——自定义View显示超大图片

上一节(自定义初学5--自定义View显示图片)已经说了如何自定义View显示图片.做android时,加载图片是避免不了的,加载网络图片还需要异步加载,最烦人的就是经常出现OOM,为了避免这样的问题,我们一般这样解决: 根据图片控件的大小对图片进行压缩显示. 如果图片数量非常多,则会使用LruCache等缓存机制,将所有图片占据的内容维持在一个范围内. 有时加载图片还会遇到特殊情况--就是单个图片非常巨大,还不允许压缩.那么对于这种需求,该如何做呢? 首先不压缩,按照原图尺寸加载,那么屏幕肯定