您现在的位置:首页 >> 手机开发 >> android项目 >> 内容

Android之ListView&Json加载网络数据--Java学习网

时间:2016-11-23 8:04:35

  核心提示:使用到的主要内容:1、Json 解析网络数据2、异步任务加载图片和数据3、ListView 的内存空间优化(ConvertView)和运行时间优化(ViewHolder)4、ListView 滚动监听...

使用到的主要内容:

1、Json 解析网络数据

2、异步任务加载图片和数据

3、ListView 的内存空间优化(ConvertView)和运行时间优化(ViewHolder)

4、ListView 滚动监听实现分页加载数据

5、动态定义 布局和控件(想实现下拉刷新,好像不是这样实现的..)

  .......

 

HttpUtil 工具类网络申请数据(用 Gson 解析)  

--- 别忘记添加网络权限 

<uses-permission android:name="android.permission.INTERNET"/>

 HttpUtil

 

Datas 类存放需要的数据(GsonFormat 插件)

 Datas

 

ImageLoad 工具类将图片数据转成 Bitmap 存入 ImageView

 ImageLoad

 

ListView布局 和 Item布局

 activity_main

 activity_item

 

MainActivity 自定义适配器、滚动监听实现功能

  1 package com.dragon.android.a09_09;
  2 
  3 import android.os.AsyncTask;
  4 import android.os.Bundle;
  5 import android.support.v7.app.AppCompatActivity;
  6 import android.view.Gravity;
  7 import android.view.View;
  8 import android.view.ViewGroup;
  9 import android.widget.AbsListView;
 10 import android.widget.BaseAdapter;
 11 import android.widget.FrameLayout;
 12 import android.widget.ImageView;
 13 import android.widget.ListView;
 14 import android.widget.RelativeLayout;
 15 import android.widget.TextView;
 16 import android.widget.Toast;
 17 
 18 import com.google.gson.Gson;
 19 
 20 import java.text.SimpleDateFormat;
 21 import java.util.Date;
 22 import java.util.Locale;
 23 
 24 /**
 25  * <注意: 异步任务 AsyncTask 最多不能超过 <_128 个
 26  */
 27 public class MainActivity extends AppCompatActivity {
 28 
 29     private ListView listView;
 30     private MyAdapter myAdapter;
 31 
 32     @Override
 33     protected void onCreate(Bundle savedInstanceState) {
 34         super.onCreate(savedInstanceState);
 35         setContentView(R.layout.activity_main);
 36 
 37         listView = (ListView) findViewById(R.id.listView);
 38         myAdapter = new MyAdapter();
 39 
 40         listView.setAdapter(myAdapter);
 41 
 42         // 动态定义 布局 和 View
 43         // 想用来实现下拉刷新的,不过好像有点麻烦...
 44         ListView.LayoutParams layoutParams = new ListView.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
 45         RelativeLayout relativeLayout = new RelativeLayout(this);
 46         relativeLayout.setLayoutParams(layoutParams);
 47         RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 60);
 48         TextView textView = new TextView(this);
 49         textView.setLayoutParams(lp);
 50         textView.setText("刷新数据");
 51         textView.setGravity(Gravity.CENTER);
 52         relativeLayout.addView(textView);
 53         listView.addHeaderView(relativeLayout, new FrameLayout(this), false);
 54 
 55         listView.setOnScrollListener(new AbsListView.OnScrollListener() {
 56             @Override
 57             public void onScrollStateChanged(AbsListView view, int scrollState) {
 58                 // scrollState 的 3 种类型
 59             }
 60 
 61             @Override
 62             public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
 63                 // 当链表滑动到底部的时候,去记载数据
 64                 // pageIndex != -1 为了过滤第一次加载 ListView 的时候会默认加载 onScroll 方法
 65                 if (pageIndex != -1 && !isStartLoad && firstVisibleItem + visibleItemCount == totalItemCount) {
 66                     // 滑动到底部
 67                     Toast.makeText(MainActivity.this, "加载更多", Toast.LENGTH_SHORT).show();
 68                     pageIndex += 21; // page 不是页数...
 69                     loadJson();
 70                 }
 71                 if (firstVisibleItem == 0 && visibleItemCount < 6) {
 72                     pageIndex = 0;
 73                     loadJson();
 74                 }
 75             }
 76         });
 77     }
 78 
 79     private boolean isStartLoad = false; // 上一次是否加载完成
 80 
 81     private int pageIndex = -1;
 82 
 83     private String getJsonUrl(int page) {
 84         int p = page < 0 ? 0 : page;
 85         return "http://api.qingchifan.com/api/event/city.json?access_token=6916a7ab1f71e43ac4eadf40a51b4ab1E4DA4EE79DE4C64C449D09318FE0784F, &basicCheck=0&city=0755&multi=0&gender=0&time=0&age=0&constellation=0&occupation=0&start=" + p + "&size=20&apiVersion=2.8.0";
 86     }
 87 
 88     /**
 89      * button 的点击事件
 90      *
 91      * @param view
 92      */
 93     public void startLoad(View view) {
 94         pageIndex = 0;
 95         loadJson();
 96     }
 97 
 98     /**
 99      * 加载 Json 数据
100      */
101     public void loadJson() {
102         new AsyncTask<Void, Void, Datas>() {
103 
104             @Override
105             protected void onPreExecute() {
106                 // 异步任务开启
107                 isStartLoad = true;
108             }
109 
110             @Override
111             protected Datas doInBackground(Void... params) {
112                 byte[] bytes = HttpUtil.loadByte(getJsonUrl(pageIndex));
113                 String jsonStr = new String(bytes, 0, bytes.length);
114                 Datas datas = new Gson().fromJson(jsonStr, Datas.class);
115                 return datas;
116             }
117 
118             @Override
119             protected void onPostExecute(Datas datas) {
120                 if (pageIndex == 0) {
121                     myAdapter.setmDatas(datas);
122                 } else {
123                     // 加载最新的数据(下拉刷新)
124                     myAdapter.addUsers(datas);
125                 }
126                 isStartLoad = false;
127             }
128         }.execute();
129     }
130 
131     /**
132      * 自定义适配器
133      */
134     class MyAdapter extends BaseAdapter {
135 
136         private Datas mDatas;
137 
138         /**
139          * ListView 的<运行时间优化(ViewHolder)
140          */
141         class ViewHolder {
142             ImageView imageView;
143             TextView tv_title;
144             TextView tv_msg;
145             TextView tv_time;
146         }
147 
148         public Datas getmDatas() {
149             return mDatas;
150         }
151 
152         public void setmDatas(Datas mDatas) {
153             this.mDatas = mDatas;
154             // 刷新适配器
155             notifyDataSetChanged();
156         }
157 
158         /**
159          * 完成数据的添加
160          *
161          * @param datas 添加后的数据
162          */
163         public void addUsers(Datas datas) {
164             this.mDatas.getData().getResults().addAll(datas.getData().getResults());
165             // 刷新适配器
166             notifyDataSetChanged();
167         }
168 
169         @Override
170         public int getCount() {
171             return mDatas == null ? 0 : mDatas.getData().getResults().size();
172         }
173 
174         @Override
175         public Datas.DataBean.ResultsBean getItem(int position) {
176             return mDatas.getData().getResults().get(position);
177         }
178 
179         @Override
180         public long getItemId(int position) {
181             return position;
182         }
183 
184         @Override
185         public View getView(int position, View convertView, ViewGroup parent) {
186             Datas.DataBean.ResultsBean item = getItem(position); // 当前行的数据
187             ViewHolder viewHolder;
188             View layout;
189 
190             /**
191              * <布局重用(重要!) --- ListView 的<内存空间优化(ConvertView)
192              */
193             if (convertView != null) {
194                 viewHolder = (ViewHolder) convertView.getTag();
195                 layout = convertView;  // 重用回收的布局
196             } else {
197                 layout = getLayoutInflater().inflate(R.layout.activity_item, parent, false);
198 
199                 viewHolder = new ViewHolder(); // 当前的 Item 的布局的子控件的引用的集合
200                 initItemView(layout, viewHolder);
201 
202                 layout.setTag(viewHolder); // 把该布局的子控件的而引用,绑定要该布局上
203             }
204             initViewData(item, viewHolder);
205 
206             return layout;
207         }
208 
209         /**
210          * 初始化 Item 中 View 的数据
211          *
212          * @param item
213          */
214         private void initViewData(Datas.DataBean.ResultsBean item, ViewHolder viewHolder) {
215             String imgUrl = item.getCaterSPhotoUrl();
216             ImageLoad.display(imgUrl, viewHolder.imageView);
217 
218             viewHolder.tv_title.setText(item.getCaterBranchName());
219             viewHolder.tv_msg.setText(item.getEventDescription());
220             viewHolder.tv_time.setText(new SimpleDateFormat("yyyy-M-d H:m:s", Locale.CHINA).format(new Date(item.getActionTime())));
221         }
222 
223         /**
224          * 根据传递的参数初始化 Item 中的 View
225          *
226          * @param view layout / convertView
227          */
228         private void initItemView(View view, ViewHolder viewHolder) {
229             viewHolder.imageView = (ImageView) view.findViewById(R.id.imageView1);
230             viewHolder.tv_title = (TextView) view.findViewById(R.id.textView1);
231             viewHolder.tv_msg = (TextView) view.findViewById(R.id.textView2);
232             viewHolder.tv_time = (TextView) view.findViewById(R.id.textView3);
233         }
234     }
235 }

Java免费学习   Java自学网 http://www.javalearns.com

关注微信号:javalearns   随时随地学Java

或扫一扫

随时随地学Java

作者:不详 来源:网络
    你是从哪里知道本网站的?
  • 网友介绍的
  • 百度搜索的
  • Google搜索的
  • 其它搜索过来的
  • 网址输错了进来的
  • 太忙了不记得了
共有评论 0相关评论
发表我的评论
  • 大名:
  • 内容:
本类推荐
  • 没有
本类固顶
  • 没有
  • java学习网(www.javalearns.com) © 2014 版权所有 All Rights Reserved.
  • Email:javalearns@163.com 站长QQ:1356121699 晋ICP备14003680号-3
  • java学习网部分内容来自网络或网友发布,如侵犯了您利益,请发邮件至:javalearns@126.com,我们尽快处理!
  • Java学习网
  • 网站统计
  • 晋公网安备 14042902000001号