定义LIstView下拉加载数据
2016-12-12 09:00
211 查看
妙语皆随晨曦出 2016-12-11 22:57
ListView下拉加载更多数据
1.创建footerView布局footer.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/footerLLayout"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal">
<ProgressBar
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="加载更多"
android:gravity="center|left"
android:layout_weight="3"/>
</LinearLayout>
2.重写ListView,监听滚动状态,定义加载数据接口
public class FooterListView extends ListView implements AbsListView.OnScrollListener{
public FooterListView(Context context, AttributeSet attrs) {
super(context, attrs);
addFooterView();
}
public FooterListView(Context context) {
super(context);
addFooterView();
}
/**
* 重写ListView 添加FooterView
*/
private View footerView;
private void addFooterView(){
footerView=LayoutInflater.from(getContext()).inflate(R.layout.footer,null);
addFooterView(footerView);
footerView.setVisibility(View.GONE);//初始状态 footerView不显示
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//最后一个可见的Item id==item总数,已经滑动到底部了,并且停止滚动了,那么就加载数据
if(totalItemCount==firstVisibleItem+visibleItemCount && scrollState==SCROLL_STATE_IDLE){
if (iLoadListener!=null) {
footerView.setVisibility(View.VISIBLE);//加载数据 footerView显示
iLoadListener.loadData();//调用接口加载数据
}
}
Log.d(TAG,"onScrollStateChanged");
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.firstVisibleItem=firstVisibleItem;
this.visibleItemCount=visibleItemCount;
this.totalItemCount=totalItemCount;
Log.d(TAG,"onScroll");
}
//ListView的第一个Item,可见Item的总数,ListViewItem的总数
private int firstVisibleItem,visibleItemCount,totalItemCount;
private String TAG=FooterListView.class.getSimpleName();
//数据加载完成隐藏footerView
public void loadComplete(){
footerView.setVisibility(View.GONE);
}
//定义加载数据的接口
public interface ILoadListener{
void loadData();
}
private ILoadListener iLoadListener;
public void setiLoadListener(ILoadListener iLoadListener){
this.iLoadListener=iLoadListener;
}
}
3.创建ListAdapter布局item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="16sp"/>
</LinearLayout>
4.定义ListAdapter
public class ListAdapter extends BaseAdapter {
private Context context;
private List<String> list;
public ListAdapter(Context context, List<String> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.item,parent,false);
holder=new ViewHolder();
holder.tv=(TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
holder.tv.setText(list.get(position));
return convertView;
}
static class ViewHolder{
TextView tv;
}
}
5.在MainActivity中实现加载数据接口
public class MainActivity extends Activity implements FooterListView.ILoadListener {
private FooterListView listView;
private ListAdapter adapter;
private List<String> data=new ArrayList<String>();
{
data.add("第1条数据");
data.add("第2条数据");
data.add("第3条数据");
data.add("第4条数据");
data.add("第5条数据");
data.add("第6条数据");
data.add("第7条数据");
data.add("第11条数据");
data.add("第21条数据");
data.add("第31条数据");
data.add("第41条数据");
data.add("第51条数据");
data.add("第61条数据");
data.add("第71条数据");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(FooterListView) findViewById(R.id.listView);
listView.setiLoadListener(this);
adapter=new ListAdapter(this,data);
listView.setAdapter(adapter);
}
@Override
public void loadData() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
data.add("新添加的数据1");
data.add("新添加的数据2");
adapter.notifyDataSetChanged();
listView.loadComplete();//加载完成
}
},10000);
}
}
6.MainActivity布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ruhu.listviewfooterloadmore.MainActivity">
<com.example.ruhu.listviewfooterloadmore.FooterListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
7.运行结果
7.1初始状态
7.2正在加载
7.3加载完成
ListView下拉加载更多数据
1.创建footerView布局footer.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/footerLLayout"
android:layout_width="match_parent"
android:layout_height="60dp"
android:orientation="horizontal">
<ProgressBar
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="2"/>
<TextView
android:layout_width="0dp"
android:layout_height="match_parent"
android:text="加载更多"
android:gravity="center|left"
android:layout_weight="3"/>
</LinearLayout>
2.重写ListView,监听滚动状态,定义加载数据接口
public class FooterListView extends ListView implements AbsListView.OnScrollListener{
public FooterListView(Context context, AttributeSet attrs) {
super(context, attrs);
addFooterView();
}
public FooterListView(Context context) {
super(context);
addFooterView();
}
/**
* 重写ListView 添加FooterView
*/
private View footerView;
private void addFooterView(){
footerView=LayoutInflater.from(getContext()).inflate(R.layout.footer,null);
addFooterView(footerView);
footerView.setVisibility(View.GONE);//初始状态 footerView不显示
setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
//最后一个可见的Item id==item总数,已经滑动到底部了,并且停止滚动了,那么就加载数据
if(totalItemCount==firstVisibleItem+visibleItemCount && scrollState==SCROLL_STATE_IDLE){
if (iLoadListener!=null) {
footerView.setVisibility(View.VISIBLE);//加载数据 footerView显示
iLoadListener.loadData();//调用接口加载数据
}
}
Log.d(TAG,"onScrollStateChanged");
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.firstVisibleItem=firstVisibleItem;
this.visibleItemCount=visibleItemCount;
this.totalItemCount=totalItemCount;
Log.d(TAG,"onScroll");
}
//ListView的第一个Item,可见Item的总数,ListViewItem的总数
private int firstVisibleItem,visibleItemCount,totalItemCount;
private String TAG=FooterListView.class.getSimpleName();
//数据加载完成隐藏footerView
public void loadComplete(){
footerView.setVisibility(View.GONE);
}
//定义加载数据的接口
public interface ILoadListener{
void loadData();
}
private ILoadListener iLoadListener;
public void setiLoadListener(ILoadListener iLoadListener){
this.iLoadListener=iLoadListener;
}
}
3.创建ListAdapter布局item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="50dp">
<TextView
android:id="@+id/tv"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:textSize="16sp"/>
</LinearLayout>
4.定义ListAdapter
public class ListAdapter extends BaseAdapter {
private Context context;
private List<String> list;
public ListAdapter(Context context, List<String> list) {
this.context = context;
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return list.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
convertView= LayoutInflater.from(context).inflate(R.layout.item,parent,false);
holder=new ViewHolder();
holder.tv=(TextView) convertView.findViewById(R.id.tv);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
holder.tv.setText(list.get(position));
return convertView;
}
static class ViewHolder{
TextView tv;
}
}
5.在MainActivity中实现加载数据接口
public class MainActivity extends Activity implements FooterListView.ILoadListener {
private FooterListView listView;
private ListAdapter adapter;
private List<String> data=new ArrayList<String>();
{
data.add("第1条数据");
data.add("第2条数据");
data.add("第3条数据");
data.add("第4条数据");
data.add("第5条数据");
data.add("第6条数据");
data.add("第7条数据");
data.add("第11条数据");
data.add("第21条数据");
data.add("第31条数据");
data.add("第41条数据");
data.add("第51条数据");
data.add("第61条数据");
data.add("第71条数据");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(FooterListView) findViewById(R.id.listView);
listView.setiLoadListener(this);
adapter=new ListAdapter(this,data);
listView.setAdapter(adapter);
}
@Override
public void loadData() {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
data.add("新添加的数据1");
data.add("新添加的数据2");
adapter.notifyDataSetChanged();
listView.loadComplete();//加载完成
}
},10000);
}
}
6.MainActivity布局activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.ruhu.listviewfooterloadmore.MainActivity">
<com.example.ruhu.listviewfooterloadmore.FooterListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
7.运行结果
7.1初始状态
7.2正在加载
7.3加载完成
相关文章推荐
- Android ListView下拉加载更多,http请求加载数据,Item点击事件
- PullToRefresh 上拉刷新,下拉加载网络数据 ListView
- Android listView 动态加载数据,下拉加载数据,上拉加载数据
- 一步一步实现ListView加载网络数据,下滑底部加载,顶部下拉刷新。并配有双缓存
- PullToRefreshListView,上拉加载更多时,数据加20条。。。。。。下拉加载更多时,数据加0条,
- Android中ListView通过loadMore按钮或者下拉到底部加载数据
- 自定义ListView 实现上拉刷新 下拉加载数据
- 点击侧滑任何一个 菜单项,请求网络数据展示在主界面的xlistview中且实现下拉刷新效果和上拉加载的分页加载数据效果
- Android ListView下拉与上拉刷新加载更多数据 二
- android Listview下拉滚动时自动加载数据
- listView 下拉动态加载数据
- React Native ListView上拉刷新,下拉加载刷新,并添加网络无数据时的缺省图
- ListView动态加载数据模板(使用xml布局)
- Android ListView 滚动加载数据
- Android中ListView分页加载数据
- ListView动态加载数据
- 解决ListView异步加载数据完成后点击无响应
- Android中ListView分页加载数据
- android中listview分页加载数据
- Listview动态加载数据