android listview json数据,Android之ListView&Json加载网络数据--Java学习网

这个博客主要展示了如何在Android应用中实现下拉刷新和加载更多的功能。通过自定义Adapter和使用AsyncTask加载网络数据,结合ListView的OnScrollListener监听滑动事件,当用户滚动到底部时自动加载更多数据,同时支持手动触发刷新操作。
摘要由CSDN通过智能技术生成

1 packagecom.dragon.android.a09_09;2

3 importandroid.os.AsyncTask;4 importandroid.os.Bundle;5 importandroid.support.v7.app.AppCompatActivity;6 importandroid.view.Gravity;7 importandroid.view.View;8 importandroid.view.ViewGroup;9 importandroid.widget.AbsListView;10 importandroid.widget.BaseAdapter;11 importandroid.widget.FrameLayout;12 importandroid.widget.ImageView;13 importandroid.widget.ListView;14 importandroid.widget.RelativeLayout;15 importandroid.widget.TextView;16 importandroid.widget.Toast;17

18 importcom.google.gson.Gson;19

20 importjava.text.SimpleDateFormat;21 importjava.util.Date;22 importjava.util.Locale;23

24 /**

25 *

27 public class MainActivity extendsAppCompatActivity {28

29 privateListView listView;30 privateMyAdapter myAdapter;31

32 @Override33 protected voidonCreate(Bundle savedInstanceState) {34 super.onCreate(savedInstanceState);35 setContentView(R.layout.activity_main);36

37 listView =(ListView) findViewById(R.id.listView);38 myAdapter = newMyAdapter();39

40 listView.setAdapter(myAdapter);41

42 //动态定义 布局 和 View43 //想用来实现下拉刷新的,不过好像有点麻烦...

44 ListView.LayoutParams layoutParams = newListView.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(newAbsListView.OnScrollListener() {56 @Override57 public void onScrollStateChanged(AbsListView view, intscrollState) {58 //scrollState 的 3 种类型

59 }60

61 @Override62 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, inttotalItemCount) {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(intpage) {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 *@paramview92 */

93 public voidstartLoad(View view) {94 pageIndex = 0;95 loadJson();96 }97

98 /**

99 * 加载 Json 数据100 */

101 public voidloadJson() {102 new AsyncTask() {103

104 @Override105 protected voidonPreExecute() {106 //异步任务开启

107 isStartLoad = true;108 }109

110 @Override111 protectedDatas 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 returndatas;116 }117

118 @Override119 protected voidonPostExecute(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 extendsBaseAdapter {135

136 privateDatas mDatas;137

138 /**

139 * ListView 的

141 classViewHolder {142 ImageView imageView;143 TextView tv_title;144 TextView tv_msg;145 TextView tv_time;146 }147

148 publicDatas getmDatas() {149 returnmDatas;150 }151

152 public voidsetmDatas(Datas mDatas) {153 this.mDatas =mDatas;154 //刷新适配器

155 notifyDataSetChanged();156 }157

158 /**

159 * 完成数据的添加160 *161 *@paramdatas 添加后的数据162 */

163 public voidaddUsers(Datas datas) {164 this.mDatas.getData().getResults().addAll(datas.getData().getResults());165 //刷新适配器

166 notifyDataSetChanged();167 }168

169 @Override170 public intgetCount() {171 return mDatas == null ? 0: mDatas.getData().getResults().size();172 }173

174 @Override175 public Datas.DataBean.ResultsBean getItem(intposition) {176 returnmDatas.getData().getResults().get(position);177 }178

179 @Override180 public long getItemId(intposition) {181 returnposition;182 }183

184 @Override185 public View getView(intposition, View convertView, ViewGroup parent) {186 Datas.DataBean.ResultsBean item = getItem(position); //当前行的数据

187 ViewHolder viewHolder;188 View layout;189

190 /**

191 *

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 returnlayout;207 }208

209 /**

210 * 初始化 Item 中 View 的数据211 *212 *@paramitem213 */

214 private voidinitViewData(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(newDate(item.getActionTime())));221 }222

223 /**

224 * 根据传递的参数初始化 Item 中的 View225 *226 *@paramview layout / convertView227 */

228 private voidinitItemView(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 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值