热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Android分组列表悬停显示,分组listView悬停效果,带下拉刷新和上拉加载更多

分组列表,带下拉刷新和上拉加载更多【项目地址在文章最后!!】效果图:实现过程,借鉴PinnedHeadListView,但是该demo没有下拉刷新功能,故将该控件整合到PullT

分组列表,带下拉刷新和上拉加载更多【项目地址在文章最后!!】
效果图:
按时间分组列表
实现过程,借鉴PinnedHeadListView,但是该demo没有下拉刷新功能,故将该控件整合到PullToRefresh 库中,【PullToRefresh 库为第三方开源库,附含各种下拉刷新和加载控件】最后形成自己的控件

项目源代码:

整合过程:
一、整合PullToRefreshListView 和 PinnedHeadListView库
1、PullToRefreshListView做为library,主工程引入
2、通过拷贝src/com/handmark/pulltorefresh/library/PullToRefreshListView.java类到新建的PullToRefreshUpLoadPinnedHeaderListView.java类中;
修改:createListView方法,
protected ListView createListView(Context context, AttributeSet attrs) {
final ListView lv;
// if (VERSION.SDK_INT >= VERSION_CODES.GINGERBREAD) {
// lv = new InternalListViewSDK9(context, attrs);
// } else {
// lv = new InternalListView(context, attrs);
// }
lv = new UpLoadPinnedHeaderListView(context, attrs);
return lv;
}
3、提示需要导入PinnedSectionedHeaderAdapter,而PinnedSectionedHeaderAdapter是 PinnedHeadListView的内部方法,故拷贝可用的PinnedHeadListView到PullToRefresh库中
4、之后提示PinnedHeadListView中找不到SectionedBaseAdapter,从可用的PinnedHeadListView工程中拷贝到PullToRefresh库中。
最后PullToRefreshListView库新增的目录结构为:
整合好的依赖库目录结构
二、主工程中调用
1、layout中引入该listView:

<com.handmark.pulltorefresh.library.PullToRefreshUpLoadPinnedHeaderListView
xmlns:ptr="http://schemas.android.com/apk/res-auto"
android:id="@+id/pinnedListView"
android:layout_hljs-string">"match_parent"
android:layout_hljs-string">"wrap_content"
android:background="@color/white"
android:divider="@color/view_line"
android:dividerhljs-string">"1dp"
ptr:ptrHeaderTextColor="@android:color/darker_gray" >
com.handmark.pulltorefresh.library.PullToRefreshUpLoadPinnedHeaderListView>

二、主工程目录结构:
项目地址在文章最后
activity中
实现下拉刷新和上拉加载需要在activity调用中继承如下两个接口:
OnLoadingMoreLinstenerInPull, OnRefreshListener

调用过程完成代码【读取assets中假数据进行显示,主要难点是解析数据进行重组成控件所需要的数据结构。。下面代码已经列出解析过程。可以直接用】:


/**
* 带分组功能的listView,待上拉加载和下拉刷新功能
*
* @author zp
*
* 2015年11月22日
*/

public class ZActivity_tixianHistory_groupList extends Activity implements
OnLoadingMoreLinstenerInPull, OnRefreshListener,
OnItemClickListener {
int pageSize = 10;

/**
* 待section的listView,控件
*/

PullToRefreshUpLoadPinnedHeaderListView pullLoadpinnedlistView;
ListView pinnedlistView;
ZAdapter_tixian_recordHistory tixianAdapter;//
private RelativeLayout moredata;
private View progressBarView;
private TextView progressBarTextView;
private AnimationDrawable loadingAnimation;
private boolean isLoading = false;
private LayoutInflater inflater;
/**
* 数组分组使用参数
*/

List listGroup = new ArrayList();// 组容器。存放所有的组,用于listView参数
List listLast = new ArrayList();// 存放分好组的数据模型,用于显示到listview
ZModel_tixian_record model = null;// 实体类对象
List list_son_collect;// 保存实体列表中内容数据
CashWithDrawRequestList son_record_detail;// 某个组下的list容器
int pageno = 1;
ProgressDialog progressDialog;

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

initViews();
}

private void initViews() {
// 1、 初始化PinnedListView
pinnedlistView = getListView();
/**
* 加载底部上拉加载视图
*/

LayoutInflater inflator = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
inflater = LayoutInflater.from(this);
moredata = (RelativeLayout) inflater.inflate(R.layout.foot_loading,
null);
progressBarView = (View) moredata
.findViewById(R.id.loadmore_foot_progressbar);
progressBarTextView = (TextView) moredata
.findViewById(R.id.loadmore_foot_text);
loadingAnimation = (AnimationDrawable) progressBarView.getBackground();
pinnedlistView.addFooterView(moredata);
((UpLoadPinnedHeaderListView) pinnedlistView)
.setLoadingMoreListener(this);

startTixianRecordList();// 此处请求接口获取数据。此处使用假数据代替演示效果
}

public ListView getListView() {

pullLoadpinnedlistView = (PullToRefreshUpLoadPinnedHeaderListView) findViewById(R.id.pinnedListView);
pullLoadpinnedlistView.setOnRefreshListener(this);

return pullLoadpinnedlistView.getRefreshableView();
}

@Override
public void OnLoadingMore() {
progressBarView.setVisibility(View.VISIBLE);
progressBarTextView.setVisibility(View.VISIBLE);

loadingAnimation.start();

if (!isLoading) {
isLoading = true;
new Handler().postDelayed(new Runnable() {

@Override
public void run() {
loadingFinished();
}
}, 1200);
}

}

public void loadingFinished() {

if (null != loadingAnimation && loadingAnimation.isRunning()) {
loadingAnimation.stop();
}
progressBarView.setVisibility(View.GONE);
progressBarTextView.setVisibility(View.GONE);
isLoading = false;
tixianAdapter.notifyDataSetChanged();
}

@Override
public void onItemClick(AdapterView parent, View view, int position,
long id) {// 筛选项点击后
}

/**
* 模拟数据(从assets中读取json解析出其中的list,然后进行分组处理)
*/

public String getDataFromAsset(String datasource) {

byte b[] = this.getData(this, datasource);
String str = "";
try {
str = new String(b, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.out.println("读取asset假数据==" + str);
return str;
}

/**
* 将得到的 普通list集合 分组重组以适用于与分组listView
*
* @param rrs
* :接口返回的list数据
*/

public void transferForGroupList(
List list_cash) {
int groupSize = 0;

for (int i = 0; i <(list_cash).size(); i++) {
// 如果不含该组就添加到组中,保证listGroup中不存在重复组名
if (!listGroup.contains(dealDataForYM(list_cash.get(i)
.getApplytime()))) {
model = new ZModel_tixian_record();// 实体类
listGroup.add(dealDataForYM(list_cash.get(i).getApplytime()));// 所有的组
groupSize++;
model.setGroupTime(dealDataForYM(list_cash.get(i)
.getApplytime()));

list_son_collect = new ArrayList();
// 组和子列表分开保存
for (int j = 0; j // 遍历所有数据,如果含有该组名就添加到组对应的list中
if (dealDataForYM(list_cash.get(j).getApplytime()).equals(
listGroup.get(groupSize - 1))) {
son_record_detail = new CashWithDrawRequestList();

son_record_detail.amount = list_cash.get(j).getAmount();
son_record_detail.applytime = list_cash.get(j)
.getApplytime();
son_record_detail.status = list_cash.get(j).getStatus();
son_record_detail.fee = list_cash.get(j).getStatus();

list_son_collect.add(son_record_detail);
}
}
model.setCashWithDrawRequestList(list_son_collect);
listLast.add(model);
}
}
}

/**
* 截取出年月(2015-09)
*
* @param datetotal
* @return
*/

public String dealDataForYM(String datetotal) {
String res = "";
res = datetotal.substring(0,
datetotal.indexOf("-", datetotal.indexOf("-") + 1));// 截取到第二个“-”之前
System.out.println("截取时间年月==" + res);
return res;
}

/**
* 获取历史体现记录并解析分组处理
*
* @param pageNo
* @param pageSize
*/

private void startTixianRecordList() {
// 2、 读取假数据
String respOnse= getDataFromAsset("searchTixianrecordList.txt");

// 3、 初步解析
Gson gson = new Gson();
GetCashWithDrawRequestResponse info = gson.fromJson(response,
GetCashWithDrawRequestResponse.class);

if (info.getCashWithDrawRequestList() != null
&& info.getCashWithDrawRequestList().size() > 0) {

// 4、分组处理【重点】,重新拼装成分组控件所需的数据结构
transferForGroupList(info.getCashWithDrawRequestList());

tixianAdapter = new ZAdapter_tixian_recordHistory(
ZActivity_tixianHistory_groupList.this, listLast, listGroup);
pinnedlistView.setAdapter(tixianAdapter);

tixianAdapter.notifyDataSetInvalidated();
tixianAdapter.notifyDataSetChanged();
}
}

// 读取assets里的数据
public static byte[] getData(Context context, String fileUrl) {
byte[] data = null;
AssetManager am = context.getAssets();

try {
InputStream is = am.open(fileUrl);
byte[] buffer = new byte[256];
int length = 0;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while ((length = is.read(buffer)) > 0) {
baos.write(buffer, 0, length);
}
data = baos.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return data;
}

@Override
public void onRefresh(PullToRefreshBase refreshView) {
Toast.makeText(ZActivity_tixianHistory_groupList.this, "on Refresh……",
Toast.LENGTH_SHORT).show();
}
}

项目下载地址:http://download.csdn.net/detail/u011084603/9370613


推荐阅读
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 在一对一直播源码使用过程中,有时会出现软键盘切换闪屏问题,就是当切换表情的时候屏幕会跳动,因此要对一对一直播源码表情面板无缝切换进行优化。 ... [详细]
  • 这两天用到了ListView,写下遇到的一些问题。首先是ListView本身与子控件的焦点问题,比如我这里子控件用到了Button,在需要ListView中的根布局属性上加上下面的这一个属性:and ... [详细]
  • 本文介绍了使用kotlin实现动画效果的方法,包括上下移动、放大缩小、旋转等功能。通过代码示例演示了如何使用ObjectAnimator和AnimatorSet来实现动画效果,并提供了实现抖动效果的代码。同时还介绍了如何使用translationY和translationX来实现上下和左右移动的效果。最后还提供了一个anim_small.xml文件的代码示例,可以用来实现放大缩小的效果。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的步骤和方法
    本文介绍了在CentOS/RHEL 7/6,Fedora 27/26/25上安装JAVA 9的详细步骤和方法。首先需要下载最新的Java SE Development Kit 9发行版,然后按照给出的Shell命令行方式进行安装。详细的步骤和方法请参考正文内容。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • 本文介绍了响应式页面的概念和实现方式,包括针对不同终端制作特定页面和制作一个页面适应不同终端的显示。分析了两种实现方式的优缺点,提出了选择方案的建议。同时,对于响应式页面的需求和背景进行了讨论,解释了为什么需要响应式页面。 ... [详细]
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 本文整理了Java中java.lang.NoSuchMethodError.getMessage()方法的一些代码示例,展示了NoSuchMethodErr ... [详细]
  • 开发笔记:(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了(002)spring容器中bean初始化销毁时执行的方法及其3种实现方式相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Java大文件HTTP断点续传到服务器该怎么做?
    最近由于笔者所在的研发集团产品需要,需要支持高性能的大文件http上传,并且要求支持http断点续传。这里在简要归纳一下,方便记忆 ... [详细]
  • 开发笔记:UEditor调用上传图片上传文件等模块
    1、引入ue相关文件,写好初始代码为了更好的封装整一个单独的插件,这里我们要做到示例化ue后隐藏网页中的编辑窗口,并移除焦点。 ... [详细]
  • 原文转自:http:blog.csdn.netchinasoftosgarticledetails7903045UploadAction.java:packagecr ... [详细]
author-avatar
阿乀胜69
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有