原:
Android如果ListView不需要通过点击Header或者Footer来增加新数据,那还比较简单。有一种情况是需要通过点击Header和Footer来向ListView中添加新的数据,这在理论上就是可以包含无限元素的ListView。
我在经历的两个项目中都遇到过这种情况,在做第一个项目时,因为经验不足,走了很多弯路,写出来的代码也相当复杂。在我做第二个项目的时候,我对前一次的代码进行了优化,在满足要求和性能的同时,代码量大大减少。
下面就是包含Header和Footer的无限ListView的一个实现,通过点击Header或者Footer,可以向ListView中添加数据,这是第一个版本。
1. MainActivity.java
MainActivity的作用是显示主界面的ListView。
package com.wubotao.activity;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import com.wubotao.adapter.StringAdapter;
public class MainActivity extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main_list);
List list = new ArrayList();
for (int i = 0; i < 10; i++) {
String text = "text-" + i;
list.add(text);
}
ListView listView = (ListView) findViewById(R.id.listview_main);
StringAdapter adapter = new StringAdapter(this, list, listView);
listView.setAdapter(adapter);
}
}
2. AbstractAdapter.javaAbstractAdapter是一个抽象类,实现了BaseAdapter的部分方法。
package com.wubotao.adapter;
import java.util.List;
import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.widget.BaseAdapter;
import android.widget.ListView;
/**
*
*
* @author wubotao
*
* @param
* 被存放元素的类型
*
*
*/
public abstract class AbstractAdapter extends BaseAdapter {
protected Context context;
protected List list;
protected ListView listView;
protected AbstractAdapter(Context context, List list, ListView listView) {
this.context = context;
this.list = list;
this.listView = listView;
init();
}
/**
* 数据和用户界面初始化
*/
public abstract void init();
public int getCount() {
return list == null ? 0 : list.size();
}
public Object getItem(int position) {
return list.get(position);
}
public long getItemId(int position) {
return position;
}
protected Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
notifyDataSetChanged();
}
};
}
3.
StringAdapter.java
StringAdapter继承自AbstractAdapter,主要作用是实现数据和ListView图形界面的交互。
package com.wubotao.adapter;
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.ViewSwitcher;
import com.wubotao.activity.R;
/**
*
*
* @author wubotao
*
*/
public class StringAdapter extends AbstractAdapter {
boolean headerLoading = false;
boolean footerLoading = false;
ViewSwitcher footerView;
ViewSwitcher headerView;
public StringAdapter(Context context, List list, ListView listView) {
super(context, list, listView);
}
@Override
public void init() {
LayoutInflater inflater = LayoutInflater.from(context);
headerView = (ViewSwitcher) inflater.inflate(R.layout.header, null);
listView.addHeaderView(headerView);
footerView = (ViewSwitcher) inflater.inflate(R.layout.footer, null);
listView.addFooterView(footerView);
TextView moreByHeader = (TextView) headerView
.findViewById(R.id.textview_to_load_more);
moreByHeader.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!headerLoading) {
new HeaderTask().execute("");
}
}
});
TextView moreByFooter = (TextView) footerView
.findViewById(R.id.textview_to_load_more);
moreByFooter.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!footerLoading) {
new FooterTask().execute("");
}
}
});
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.main_list_item, null);
viewHolder.content = (TextView) convertView
.findViewById(R.id.textview_content);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
String text = (String) getItem(position);
viewHolder.content.setText(text);
return convertView;
}
class ViewHolder {
TextView content;
}
class HeaderTask extends AsyncTask> {
@Override
protected void onPreExecute() {
headerLoading = true;
headerLoading(true);
}
@Override
protected List doInBackground(String... params) {
List list = new ArrayList();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10; i++) {
list.add("header-" + i);
}
return list;
}
@Override
protected void onPostExecute(List result) {
list.addAll(0, result);
notifyDataSetChanged();
headerLoading = false;
headerLoading(false);
}
}
class FooterTask extends AsyncTask> {
@Override
protected void onPreExecute() {
footerLoading = true;
footerLoading(true);
}
@Override
protected List doInBackground(String... params) {
List messages = new ArrayList();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
for (int i = 0; i < 10; i++) {
list.add("header-" + i);
}
return messages;
}
@Override
protected void onPostExecute(List result) {
list.addAll(result);
notifyDataSetChanged();
footerLoading = false;
footerLoading(false);
}
}
private void footerLoading(boolean isLoading) {
if (isLoading) {
footerView.setDisplayedChild(1);
} else {
footerView.setDisplayedChild(0);
}
}
private void headerLoading(boolean isLoading) {
if (isLoading) {
headerView.setDisplayedChild(1);
} else {
headerView.setDisplayedChild(0);
}
}
}
分享到:
相关推荐
练习过程中拆分listView各个东西,然后拼凑上去,初学者可以看看。
ListView中动态显示和隐藏Header&Footer 如果需要动态的显示和隐藏footer的话,按照惯例,误以为直接通过setVisibility中的View.GONE就可以实现。但是在实际使用中发现并不是这样的。 例如,先加
过去的两天,在项目中,抛弃了ListView, 想试一试RecyclerView, 在用的过程中,遇到了一些问题,比如:如何为RecyclerView添加Header和Footer? 如何为RecyclerView添加分割线?如何为RecyclerView添加下拉刷新和上拉...
今天得需求是做listview+上下拉动在header和footer显示progressdialog,但不影响用户操作 直接上代码,我已经加上注释了,自己看。 package com.stay.main; import java.net.HttpURLConnection; import java.util....
强大的Android下拉刷新框支持下拉刷新、上拉加载、二级刷新、越界回弹、越界拖动,具有极强的扩展性,并集成了几十种炫酷的Header和 Footer。 支持横向刷新 支持多点触摸 支持淘宝二楼和二级刷新 支持嵌套多层的视图...
BGARecyclerViewAdapter 和 BGAViewHolderHelper 用于简化 RecyclerView 的适配器的编写,支持多 Item 类型,支持添加多个 Header 和 Footer,回调接口里的索引位置已经在库里处理了,不需要开发者自己减去 Header ...
图中普通列表是ListView样式,没有设置Header和Footer,使用默认的下拉刷新和上拉加载。 宫格列表使用的是自定义Header和Footer的下拉刷新和上拉上拉加载,并设置了下拉使放大的图片。 瀑布流列表使用的是自定义...
主要介绍了android实现listview下拉刷新和上拉刷新效果,Android的ListView上拉下拉刷新,原理都一样,在Touch事件中操作header/footer的paddingTop属性,需要的朋友可以参考下
SmartRefreshLayout以打造一个强大,稳定,成熟的刷新刷新框架为目标,并集成各种的炫酷,多样,实用,美观的Header和Footer。正所谓,SmartRefreshLayout是一个“聪明”或“智能”的拖动刷新布局,由于它的“智能”...
listView控件添加头部和尾部布局,是自己闲事写的简单的代码
其实网上有很多下拉刷新的例子,但都不是很共通,特别是以listview添加header或footer居多,这很明显无法应用到GridView这样的布局。基于此,我们参考前辈的代码的基础上,实现了一个还算比较共通的框架,这个框架...
ListView可以悬挂在顶端和底端及随手指移动
实现列表(ListView)header和footer隐藏之后滑动快速出现(Quick Return)的功能。如图1,是header的Quick Return,向上拖动列表时,header(红色部分)会向上滑动隐藏,无论列表拖动多少距离,一旦向下拖动列表时...
1. 在ListView中添加header和footer,监听ListView的滑动事件,动态设置header/footer的高度,但是这种方式只适用于ListView,RecyclerView。 2. 第二种方式则是继承ViewGroup或其子类,监听事件,通过scroll或...
实现列表(ListView)header和footer隐藏之后滑动快速出现(Quick Return)的功能。是header的Quick Return,向上拖动列表时,header(红色部分)会向上滑动隐藏,无论列表拖动多少距离,一旦向下拖动列表时,header...
但是ListView的一些常用功能却没有提供,比如我们平时会经常用到的addHeaderView,addFooterView,既然RecyclerView没有提供这个方法,我们应该如何为列表添加头部和底部呢,接下来通过本文给大家介绍
推荐阅读:使用RecyclerView添加Header和Footer的方法 RecyclerView的使用之HelloWorld RecyclerView 是Android L版本中新添加的一个用来取代ListView的SDK,它的灵活性与可替代性比listview更好。本文给大家介绍...