博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android listview分页显示——data from php
阅读量:4140 次
发布时间:2019-05-25

本文共 13365 字,大约阅读时间需要 44 分钟。

此demo的简单流程是:发送请求数据到php,然后php查询数据库返回json,android接收到json做动态加载更多数据和刷新listview的相关处理。

当滚动条滚动到低端时,不管有没有数据都没有做隐藏BUTTON的操作,这只是一个listview分页以及刷新的demo

php代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<div>&lt;?php
/**
* 返回JSON给客户端(安卓)
*/
//建立数据库连接
$con = mysql_connect(
"localhost"
,
"root"
,
"root"
);
if
(! $con) {
die (
'Could not connect: '
. mysql_error () );
}
//选择查询的数据库
mysql_select_db (
"test"
, $con );
//设置字符集为UTF-8
mysql_query (
"set names utf8"
);
$beginNum=$_REQUEST[
"beginNum"
];
$query =
"select id,name,sex,password from userinfo order by id desc limit $beginNum,20"
;
//执行SQL语句
$result = mysql_query ( $query );
//循环 将查询的数据存入数组
while
( $row = mysql_fetch_assoc ( $result ) ) {
$response [] = $row;
}
//使用Foreach遍历数组 同时使用urlencode处理 含有中文的字段
foreach ( $response as $key =&gt; $value ) {
$newValue[$key] = $value;
//$newData [$key] ['name'] = urlencode ( $value ['name'] );
//$newData [$key] ['sex'] = urlencode ( $value ['sex'] );
}
echo json_encode ( $newValue );
mysql_close ( $con );
?&gt;</div>

Android端代码:

布局文件:

remind_list_item.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<div>&lt;?xml version=
"1.0"
encoding=
"utf-8"
?&gt;
&lt;!-- 收件箱列表文字信息 --&gt;
&lt;RelativeLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:id=
"@+id/RelativeLayout02"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:background=
"#ffffff"
android:paddingBottom=
"4dip"
android:paddingLeft=
"12dip"
android:paddingRight=
"12dip"
&gt;&lt;TextView
android:id=
"@+id/name_textView"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:background=
"#ffffff"
android:paddingRight=
"10dip"
android:text=
""
android:textColor=
"#000000"
android:textSize=
"12dip"
/&gt;
 
&lt;TextView
android:id=
"@+id/content_textView"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:layout_below=
"@+id/name_textView"
android:background=
"#ffffff"
android:paddingTop=
"3dip"
android:textColor=
"#000000"
android:textSize=
"14dip"
/&gt;
 
&lt;TextView
android:id=
"@+id/time_textView"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:layout_below=
"@+id/content_textView"
android:background=
"#ffffff"
android:paddingTop=
"3dip"
android:textColor=
"#000000"
android:textSize=
"12dip"
/&gt;
 
&lt;/RelativeLayout&gt;
 
</div>

load_more.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<div>&lt;?xml version=
"1.0"
encoding=
"utf-8"
?&gt;
&lt;LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:id=
"@+id/loading_line"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:gravity=
"center"
android:orientation=
"vertical"
&gt;&lt;Button
android:id=
"@+id/viewmorebutton"
android:layout_width=
"fill_parent"
android:layout_height=
"38dip"
android:text=
"查看更多"
/&gt;
 
&lt;LinearLayout
android:id=
"@+id/linearlayout"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:gravity=
"center"
android:orientation=
"horizontal"
&gt;
 
&lt;ProgressBar
style=
"?android:attr/progressBarStyleSmall"
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
/&gt;
 
&lt;TextView
android:layout_width=
"wrap_content"
android:layout_height=
"wrap_content"
android:text=
"数据加载中..."
/&gt;
&lt;/LinearLayout&gt;
 
&lt;/LinearLayout&gt;
 
</div>

remind_listview.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<!-- 收件箱列表 -->
<LinearLayout xmlns:android=
"http://schemas.android.com/apk/res/android"
android:layout_width=
"fill_parent"
android:layout_height=
"fill_parent"
android:background=
"#f0f0f0"
android:orientation=
"vertical"
>
 
<RelativeLayout
xmlns:android=
"http://schemas.android.com/apk/res/android"
android:id=
"@+id/layout_topmenu"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:layout_alignParentTop=
"true"
>
 
<include layout=
"@layout/top"
/>
</RelativeLayout>
 
<ListView
android:id=
"@+id/remind_ListView"
android:layout_width=
"fill_parent"
android:layout_height=
"wrap_content"
android:cacheColorHint=
"#00000000"
>
</ListView>
 
</LinearLayout>

Java代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
/**
* 事件列表
*
* @author 技术作坊
* @version 1.0
*/
public
class
RemindListViewActivity
extends
Activity {
private
RemindListAdapter listItemAdapter =
new
RemindListAdapter();
// 适配器
private
String jsonResult;
// 从PHP返回的JSON
private
List<JSONObject> jsonData;
// JSON集合
private
ImageView refreshImageView;
// 刷新
private
ProgressBar progressBar;
// 圆形进度
private
ListView listView;
// 列表
private
View footView;
// 底部布局
private
Button viewMoreButton;
// 底部查看更多按钮
LinearLayout footerProgressBarLayout;
// 底部圆形进度
private
Handler handler;
private
GetDetailThread thread;
 
@Override
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
this
.requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.remind_listview);
listView = (ListView) findViewById(R.id.remind_ListView);
refreshImageView = (ImageView) findViewById(R.id.refresh_ImageView);
progressBar = (ProgressBar) findViewById(R.id.pb);
 
// 向列表添加一个页脚
LayoutInflater inflater = LayoutInflater.from(
this
);
footView = inflater.inflate(R.layout.load_more,
null
);
viewMoreButton = (Button) footView.findViewById(R.id.viewmorebutton);
footerProgressBarLayout = (LinearLayout) footView
.findViewById(R.id.linearlayout);
listView.addFooterView(footView);
/******当submintData()返回true时获取数据并显示查看更多数据的按钮,否则隐藏并提示程序错误******/
if
(submintData(
0
) ==
true
) {
progressBar.setVisibility(View.GONE);
footerProgressBarLayout.setVisibility(View.GONE);
handler =
new
DealHandler();
thread =
new
GetDetailThread();
thread.start();
// 开启一个线程获取数据
// refreshImageView.setOnClickListener(new
// refreshImageViewClick());// 刷新
viewMoreButton.setOnClickListener(
new
ViewMoreClickListener());
// 查看更多
}
else
{
handler =
new
DealHandler();
progressBar.setVisibility(View.GONE);
footerProgressBarLayout.setVisibility(View.GONE);
Toast.makeText(getApplicationContext(),
"程序错误"
, Toast.LENGTH_SHORT)
.show();
}
refreshImageView.setOnClickListener(
new
refreshImageViewClick());
// 刷新
}
 
/**
* 查看更多
*
* @author Guozhilong
*
*/
class
ViewMoreClickListener
implements
OnClickListener {
 
@Override
public
void
onClick(View v) {
footerProgressBarLayout.setVisibility(View.VISIBLE);
// 显示
viewMoreButton.setVisibility(View.GONE);
// 隐藏
handler.postDelayed(
new
Runnable() {
@Override
public
void
run() {
int
count = listItemAdapter.getCount();
count +=
10
;
// 在原有的基础上再加10
submintData(count);
// 当返回的JSON为空时做如下判断
if
(jsonResult.equals(
"null"
)) {
footerProgressBarLayout.setVisibility(View.GONE);
// 隐藏
viewMoreButton.setVisibility(View.VISIBLE);
// 显示
Toast.makeText(getApplicationContext(),
"数据全部加载完成,没有更多数据"
, Toast.LENGTH_SHORT).show();
}
else
{
footerProgressBarLayout.setVisibility(View.GONE);
// 隐藏
viewMoreButton.setVisibility(View.VISIBLE);
// 显示
try
{
JSONArray jsonArray =
new
JSONArray(jsonResult);
System.out.print(jsonArray.length());
for
(
int
i =
0
; i < jsonArray.length(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
listItemAdapter.addNewsItem(json);
}
listItemAdapter.notifyDataSetChanged();
}
catch
(JSONException e) {
e.printStackTrace();
}
}
}
},
2000
);
}
}
 
/**
* 提交数据
*
* @param beginNumStr
* @return
*/
public
Boolean submintData(
int
beginNumStr) {
Map<String, String> map =
new
HashMap<String, String>();
map.put(
"beginNum"
, String.valueOf(beginNumStr));
boolean
result =
false
;
try
{
result = submintDataByHttpClientDoPost(map,
"http://192.168.1.116/DataInteraction/responsefenye.php"
);
}
catch
(Exception e) {
e.printStackTrace();
}
if
(result) {
return
true
;
}
else
{
return
false
;
}
}
 
/**
* 以HttpClient的DoPost方式提交数据到服务器
*
* @param map
*            传递进来的数据,以map的形式进行了封装
* @param path
*            要求服务器PHP的地址 返回的boolean类型的参数
* @throws Exception
*/
public
Boolean submintDataByHttpClientDoPost(Map<String, String> map,
String path)
throws
Exception {
// 1. 获得一个相当于浏览器对象HttpClient,使用这个接口的实现类来创建对象,DefaultHttpClient
HttpClient hc =
new
DefaultHttpClient();
// DoPost方式请求的时候设置请求,关键是路径
HttpPost request =
new
HttpPost(path);
// 2. 为请求设置请求参数,也即是将要上传到web服务器上的参数
List<NameValuePair> parameters =
new
ArrayList<NameValuePair>();
for
(Map.Entry<String, String> entry : map.entrySet()) {
NameValuePair nameValuePairs =
new
BasicNameValuePair(
entry.getKey(), entry.getValue());
parameters.add(nameValuePairs);
}
// 请求实体HttpEntity也是一个接口,我们用它的实现类UrlEncodedFormEntity来创建对象,注意后面一个String类型的参数是用来指定编码的
HttpEntity entity =
new
UrlEncodedFormEntity(parameters,
"gbk"
);
request.setEntity(entity);
// 3. 执行请求
HttpResponse response = hc.execute(request);
// 4. 通过返回码来判断请求成功与否
if
(response.getStatusLine().getStatusCode() == HttpURLConnection.HTTP_OK) {
jsonResult = EntityUtils.toString(response.getEntity());
// 获取PHP端的echo
return
true
;
}
return
false
;
}
 
/**
* 获取JSON
*
* @param result
* @return
*/
public
List<JSONObject> getData(String result) {
// String url = "http://192.168.1.116/DataInteraction/responsejson.php";
// String result = HttpConn.getResult(url);
jsonData =
new
ArrayList<JSONObject>();
try
{
JSONArray jsonArray =
new
JSONArray(result);
for
(
int
i =
0
; i < jsonArray.length(); i++) {
JSONObject json = jsonArray.getJSONObject(i);
jsonData.add(json);
}
}
catch
(JSONException e) {
e.printStackTrace();
}
return
jsonData;
}
 
// 开启线程获取数据
class
GetDetailThread
extends
Thread {
public
void
run() {
jsonData = getData(jsonResult);
Message msg = handler.obtainMessage();
handler.sendMessage(msg);
}
}
 
class
DealHandler
extends
Handler {
public
void
handleMessage(Message msg) {
listItemAdapter.setContext(RemindListViewActivity.
this
);
listItemAdapter.setList(jsonData);
listView.setAdapter(listItemAdapter);
}
}
 
/**
* 刷新
*
* @author Guozhilong
*
*/
class
refreshImageViewClick
implements
OnClickListener {
 
@Override
public
void
onClick(View v) {
refreshImageView.setVisibility(View.GONE);
progressBar.setVisibility(View.VISIBLE);
footerProgressBarLayout.setVisibility(View.GONE);
handler.postDelayed(
new
Runnable() {
@Override
public
void
run() {
if
(submintData(
0
) ==
true
) {
thread =
new
GetDetailThread();
thread.start();
// 开启一个线程获取数据
refreshImageView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
footerProgressBarLayout.setVisibility(View.VISIBLE);
}
else
{
refreshImageView.setVisibility(View.VISIBLE);
progressBar.setVisibility(View.GONE);
footerProgressBarLayout.setVisibility(View.GONE);
Toast.makeText(getApplicationContext(),
"程序错误"
,
Toast.LENGTH_SHORT).show();
}
}
},
2000
);
}
}
}

BaseAdapter代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
<div>
/**
* 提醒列表适配器
*
* @author 技术作坊
* @version 1.0
*
*/
public
class
RemindListAdapter
extends
BaseAdapter {
private
List&lt;JSONObject&gt; list;
private
Context context;
 
public
List&lt;JSONObject&gt; getList() {
return
list;
}
 
public
void
setList(List&lt;JSONObject&gt; list) {
this
.list = list;
}
 
public
Context getContext() {
return
context;
}
 
public
void
setContext(Context context) {
this
.context = context;
}
 
@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;
}
 
//    public RemindListAdapter(Context context, List&lt;JSONObject&gt; list) {
//        this.context = context;
//        this.list = list;
//    }
 
public
View getView(
int
position, View convertView, ViewGroup parent) {
LayoutInflater mInflater = LayoutInflater.from(context);
View view = mInflater.inflate(R.layout.remind_list_item,
null
);
JSONObject json = (JSONObject) list.get(position);
 
TextView nameTextView = (TextView) view.findViewById(R.id.name_textView);
TextView contentTextView = (TextView) view.findViewById(R.id.content_textView);
TextView timeTextView = (TextView) view.findViewById(R.id.time_textView);
String titles =
""
;
//标题
String sender  =
""
;
//发件人
String sendTime=
""
;
//发送时间
try
{
 
sender = json.getString(
"name"
);
titles = json.getString(
"sex"
);
sendTime=json.getString(
"password"
);
}
catch
(JSONException e) {
e.printStackTrace();
}
nameTextView.setText(
"名字:"
+ sender);
contentTextView.setText(
"性别:"
+ titles);
timeTextView.setText(
"密码:"
+sendTime);
 
return
view;
}
public
void
addNewsItem(JSONObject newsitem) {
list.add(newsitem);
}
}
 
</div>

效果图:

更多
  

转载文章请注明出处

你可能感兴趣的文章
Palindrome Partitioning --回文切割 深搜(重重)
查看>>
对话周鸿袆:从程序员创业谈起
查看>>
Mysql中下划线问题
查看>>
Xcode 11 报错,提示libstdc++.6 缺失,解决方案
查看>>
idea的安装以及简单使用
查看>>
Windows mysql 安装
查看>>
python循环语句与C语言的区别
查看>>
vue 项目中图片选择路径位置static 或 assets区别
查看>>
vue项目打包后无法运行报错空白页面
查看>>
Vue 解决部署到服务器后或者build之后Element UI图标不显示问题(404错误)
查看>>
element-ui全局自定义主题
查看>>
facebook库runtime.js
查看>>
vue2.* 中 使用socket.io
查看>>
openlayers安装引用
查看>>
js报错显示subString/subStr is not a function
查看>>
高德地图js API实现鼠标悬浮于点标记时弹出信息窗体显示详情,点击点标记放大地图操作
查看>>
初始化VUE项目报错
查看>>
vue项目使用安装sass
查看>>
HTTP和HttpServletRequest 要点
查看>>
在osg场景中使用GLSL语言——一个例子
查看>>