ListView:控件
在上一篇文章中介绍了ListView的基本使用,如果想了解可以点击链接查看Android — ListView简单介绍
ListView从网络获取数据进行分页
这篇文章主要介绍了以下几个点
- 访问网络数据
- 多线程获取数据
- 进行分页
首先查看下接口数据,接口内容如下:
{
"data": [" qwe", " asd", " ert", " wer", " 111", " 222", " 333", " 444", " 555", " 666", " 777", " 888", " 999",
" 100", " 101", " 102", " 103", " 104", " 105", " 333", " 444", " 555", " 666", " 777", " 888", " 999", " 000"
]
}
效果图如下:
1、访问网络数据
- 获取http客户端
- 创建请求
- 执行请求
- 获取返回值并转变为自己想要的格式
- 释放资源
2、多线程获取数据分页
- 继承AsyncTask
三个参数:
1、执行任务时发送参数任务时的参数类型
2、进度
3、结果
四个步骤:
1、onPreExecute():在任务执行之前在UI线程上调用
2、doInBackground(Params...):在onPreExecute()执行后执行,此步骤用于执行耗时较长的后台计算,这个步骤必须返回计算结果,并将其传回最后一个步骤。这个步骤还可以使用 publishProgress(Progress…)来发布一个或多个进度单元。这些值在UI线程的 onProgressUpdate(Progress…)步骤中发布。
3、onProgressUpdate(Progress...):执行的时间没有定义。此方法用于在后台计算仍在执行时在用户界面中显示任何形式的进度。
4、onPostExecute(Result):后台计算完成后在UI线程上调用。后台计算的结果作为参数传递给这个步骤。
- 任务执行前调用对话框,提示正在加载
- 然后调用doInBackground() 方法获取接口的数据,并把它转换成我们想要的格式,在这里通过pageNo表示页码,一页设置10条数据,进行分页
- 调用onPostExecute() 方法加载适配器,并且页码+1
所有的代码如下:
1、布局
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
2、从网络获取数据
public class accessToNetwork {
/**
* 从网络上获取数据
* @param path 接口路径
* @param encoding 编码方式
* @return String
*/
public static String sendPostMethod(String path,String encoding){
String result = "";
CloseableHttpClient httpClient = HttpClientBuilder.create().build();
HttpPost post = new HttpPost(path);
CloseableHttpResponse response = null;
try {
response = httpClient.execute(post);
if (response.getStatusLine().getStatusCode() == 200){
result = EntityUtils.toString(response.getEntity(),encoding);
}
}catch (Exception e){
e.printStackTrace();
}finally {
try {
// 释放资源
if (httpClient != null) {
httpClient.close();
}
if (response != null) {
response.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
}
3、拿到数据进行分页
public class MainActivity extends AppCompatActivity {
private ListView listView;
private myAdapter myAdapter;
private String TAG = "MainActivity";
private boolean is_pag;
private final String PATH = "http://mock.dev.c2cloud.cn/mock/60594d7d4e52c60021b710a6/example/restful/:id/list";
private ProgressDialog progressDialog;
private int pageNo = 1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
//对话框
progressDialog = new ProgressDialog(MainActivity.this);
progressDialog.setTitle("提示");
progressDialog.setMessage("正在加载...");
new myTask().execute(PATH);
//滚动监听
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
/**监听状态
* @param view
* @param scrollState 1表示滚动 0 表示停止
*/
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (is_pag && scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE){
//如果符合条件则执行需要的逻辑
new myTask().execute(PATH);
Toast.makeText(MainActivity.this,"--"+pageNo,Toast.LENGTH_LONG).show();
}
}
/**
* @param view
* @param firstVisibleItem 已经滑过的条数
* @param visibleItemCount 可见的条数
* @param totalItemCount 总条数
*/
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
is_pag = (firstVisibleItem + visibleItemCount == totalItemCount);
}
});
}
/**
* 多线程获取网络数据
* String:执行时发送参数任务时的参数类型
* Void:进度
* List<String>:结果
*/
class myTask extends AsyncTask<String,Void,List<String>> {
/**
* 在任务执行之前在UI线程上调用
*/
@Override
protected void onPreExecute() {
super.onPreExecute();
progressDialog.show();
}
/**
* 用于执行耗时较长的后台计算,这个步骤必须返回计算结果
* @param strings
* @return
*/
@Override
protected List<String> doInBackground(String... strings) {
//获取接口数据
String result = sendPostMethod(PATH,"utf-8");
Log.i(TAG,"---"+result);
List<String> list = new ArrayList<>();
try {
JSONObject object = new JSONObject(result);
JSONArray array = object.getJSONArray("data");
int total = pageNo * 10;
for (int i = 0; i < total; i ++){
list.add(array.get(i).toString());
}
} catch (JSONException e) {
e.printStackTrace();
}
return list;
}
/**
* 计算的结果作为参数传递给这个步骤
* @param list doInBackground() 方法返回的结果
*/
@Override
protected void onPostExecute(List<String> list) {
super.onPostExecute(list);
myAdapter = new myAdapter();
myAdapter.bindData(list);
listView.setAdapter(myAdapter);
myAdapter.notifyDataSetChanged();
pageNo++;
progressDialog.dismiss();
}
}
/*
自定义适配器
*/
class myAdapter extends BaseAdapter{
List<String> list = null;
public myAdapter(){
}
public void bindData(List<String> list){
this.list = 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) {
TextView textView;
if (convertView == null){
textView = new TextView(MainActivity.this);
}else {
textView = (TextView) convertView;
}
textView.setTextSize(25);//字体大小
textView.setText(list.get(position));//内容
return textView;
}
}
}