您的位置:首页 > 其它

listView加载大量数据的优化(之尾布局实现分页加载更多)

2017-03-28 23:08 399 查看
为什么要整理这个文章或者问为什么这个这么简单还要写出来

其实是这样的 之前有人问我 listview 记载大量数据 你是怎么优化的,我却不知从何说起(暂且不说问这个只是的人想让我回到什么)

这篇就单纯针对加载更多对listView巩固一下吧 

主activity :

package com.example.listviewdemo;

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

import android.os.Bundle;
import android.os.Handler;
import android.app.Activity;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.Button;
import android.widget.ListView;

public class MainActivity extends Activity {
private ListView lv;
private View view;
private myAdapter adapter;
private int visiblelastIndex ;
private int visibleitemcount;
private Button loadbut;
private Handler myhandle = new Handler();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.listview);
view = LayoutInflater.from(this).inflate(R.layout.loadmore, null);
loadbut = (Button) view.findViewById(R.id.loading);
lv.addFooterView(view);
initadapter();
lv.setAdapter(adapter);
//dianjia 通过延时来模拟加载网络加载数据的场景 记载时正在加载,然后重新添加数据
loadbut.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
loadbut.setText("loading.....");
myhandle.postDelayed(new Runnable() {

@Override
public void run() {
// TODO Auto-generated method stub
addData();
adapter.notifyDataSetChanged();
}
}, 2000);
lv.setSelection(visiblelastIndex-visibleitemcount+1);
loadbut.setText("点击加载更多");
}
} );
lv.setOnScrollListener(new OnScrollListener() {
/**
* 滑动状态改变时被调用 arg0 是滑动时最后一条的索引 当发现最后一条索引是最后一条数据时
*/
@Overrid
public void onScrollStateChanged(AbsListView arg0, int arg1) {
// TODO Auto-generated method stub
int itemlastindex = adapter.getCount()-1;
int lastIndex = itemlastindex+1;
if(arg1 == OnScrollListener.SCROLL_STATE_IDLE && visiblelastIndex==lastIndex){
Log.i("---", "loading");
}
}
/**
* 滑动时被调用 arg1:s是显示那页的最上面的那个数据的索引 arg2:当前界面显示的数据的条数 可以用来计算最后那条数据的索引
*/
@Override
public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
visibleitemcount = arg2;
visiblelastIndex = arg1+visibleitemcount-1;
}
});

}
private void initadapter() {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
for(int i = 0;i<20;i++){
list.add(String.valueOf(i));
}
adapter = new myAdapter(list, this);
}
/**
* 模拟加载数据
*/
public void addData(){
int count = adapter.getCount();
for(int i = count;i<count+10;i++){
adapter.addItem(String.valueOf(i));
}
}

}


myAdapter
package com.example.listviewdemo;

import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class myAdapter extends BaseAdapter {
private List<String> list;
private Context context;
private LayoutInflater inflater;
public myAdapter(List<String> list,Context context){
this.list = list;
this.context = context;
inflater = LayoutInflater.from(context);
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return list.size();
}

@Override
public String getItem(int arg0) {
// TODO Auto-generated method stub
return list.get(arg0);
}

@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}

@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
View view = inflater.inflate(R.layout.item, arg2, false);
TextView tv = (TextView) view.findViewById(R.id.item_tv);
tv.setText(getItem(arg0));
// TODO Auto-generated method stub
return view;
}
/**
* 添加数据
*/
public void addItem(String item){
list.add(item);
}
}


视图文件
<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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >

<ListView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/listview"
></ListView>

</RelativeLayout>


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:orientation="vertical" >
<TextView
android:layout_width="wrap_content"
android:layout_height="50dp"
android:text="大家好才真的好,官洲好滴"
android:id="@+id/item_tv"
/>

</LinearLayout>listView的为布局
<?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:orientation="vertical" >
<Button
android:id="@+id/loading"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="加载更多"
/>

</LinearLayout>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: