-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMain.java
More file actions
303 lines (266 loc) · 7.49 KB
/
Main.java
File metadata and controls
303 lines (266 loc) · 7.49 KB
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
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
/*
* 访问远程数据库并显示相关数据
* 进行数据的分页显示
* 数据下拉刷新====>在第一个item可见并下拉一定距离时触发
* 主要是进行各种状态的判断和对应的处理
* 涉及到不同状态之间的切换,考虑使用状态模式进行重构
* 将数据处理独立到后台的服务中去
* 最终版本确定
*/
package com.example.showdata;
import java.util.ArrayList;
import java.util.List;
import com.example.showdata.R;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.Spinner;
import android.widget.SpinnerAdapter;
import android.widget.TextView;
import android.widget.Toast;
public class Main extends Activity{
//相关控件
private ListView show;
private Button pre,next,now;
private Spinner type;
private List<String> result=new ArrayList<String>();
private Handler h=new Handler();
final DatabaseHelp dh=DatabaseHelp.getDefault();
private ArrayAdapter a;
//数据相关
private int nowPage=1;
private int pageCount=0;
int itemCount=0;
//每页显示的最多数量,可自定义
private final int showCount=15;
//标记是否为最后一页等
private boolean isLast=false;
private boolean isFirstItem=true;
private boolean isRecord=false;
//加载进度条,保证其为单例
ProgressDialog pd;
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
//加载过早,等待数据更新完成后再进行加载
setContentView(R.layout.main);
initView();
loadContent(0,true);
}
//界面的初始化,这些都需要进行重用,不能去多次实例化,仅对变化的部分进行重新加载
private void initView(){
show=(ListView)findViewById(R.id.show);
now=(Button)findViewById(R.id.now);
pre=(Button)findViewById(R.id.pre);
next=(Button)findViewById(R.id.next);
type=(Spinner)findViewById(R.id.type);
//下拉刷新的实现,主要是对滑动的判断
show.setOnTouchListener(new View.OnTouchListener() {
float yStart,yEnd,length,to;
@Override
public boolean onTouch(View view, MotionEvent event) {
// TODO Auto-generated method stub
switch(event.getAction()){
case(MotionEvent.ACTION_DOWN):
//此处暂不处理
//在处于第一个项目可见且还未记录位置时进行开始位置记录
if(isFirstItem&&!isRecord){
Log.v("down and first and not record"," ");
isRecord=true;
yStart=event.getY();
}
break;
//抬起的时候根据移动的距离判断是否需要更新
case(MotionEvent.ACTION_UP):
//得到滑动的距离
yEnd=event.getY();
length=yEnd-yStart;
isRecord=false;
Log.v("length up",length+" ");
if(length>30&&isFirstItem){
//重新进行数据的加载,效率太低,数据量过多的时候会有很大的性能问题
loadContent(0,true);
//Toast.makeText(Main.this,"刷新中", Toast.LENGTH_LONG).show();
}
break;
case(MotionEvent.ACTION_MOVE):
//不断记录和更新位置,然后进行判断,如果位置到达了第一个数据条目,开始记录移动距离
if(isFirstItem&&!isRecord){
//如果到达第一项,那么开始记录这个位置
yStart=event.getY();
isRecord=true;
Log.v("yStart",yStart+" ");
}
break;
}
return false;
}
});
//滚动监听,主要是判断listview是否显示第一个item
show.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView arg0, int arg1) {
// TODO Auto-generated method stub
}
@Override
public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3) {
// TODO Auto-generated method stub
isFirstItem=arg1==0?true:false;
}
});
//下一页按钮的处理
next.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Log.v("nowPage",nowPage+" ");
pre.setVisibility(View.VISIBLE);
if(nowPage>=pageCount-1){
next.setText("没了");
isLast=true;
}else{
nowPage++;
now.setText("第"+nowPage+"页");
decideToShow();
}
}
});
//上一页按钮的处理
pre.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
if(isLast){
next.setText("下一页");
isLast=false;
}
Log.v("nowPage",nowPage+" ");
// TODO Auto-generated method stub
if(nowPage<2){
pre.setVisibility(View.INVISIBLE);
}else{
nowPage--;
now.setText("第"+nowPage+"页");
if(nowPage==1){
pre.setVisibility(View.INVISIBLE);
}
decideToShow();
}
}
});
//spinner的数据
final String[] data=new String[]{"时间","金额","卡编号"};
final ArrayAdapter a=new ArrayAdapter(this,android.R.layout.simple_list_item_1,data);
type.setAdapter(a);
type.setOnItemSelectedListener(new Spinner.OnItemSelectedListener(){
private boolean isInit=true;
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
if(!isInit){
doSelect(arg2);
//a.notifyDataSetChanged();
((TextView)arg1).setText(data[arg2]);
Log.v("dd","dd");
}
isInit=false;
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
});
}
//处理不同的排序方式
private void doSelect(int type){
loadContent(type,true);
Log.v("type",type+" ");
}
//确定需要显示的数据,其实在数据量不大的情况下可以事先分割好每一页要显示的数据,然后根据序号显示即可
//需要优化
private void decideToShow(){
//马蛋,各种陷阱
List<String> toShow=null;
if(nowPage==pageCount-1){
toShow=result.subList((nowPage-1)*showCount, (nowPage-1)*showCount+itemCount%showCount);
}else{
toShow=result.subList((nowPage-1)*showCount, (nowPage-1)*showCount+showCount);
}
Log.v("toShow",toShow.size()+" ");
//now.setText(nowPage);
//nowPage++;
a=new ArrayAdapter(Main.this,android.R.layout.simple_list_item_1,toShow);
show.setAdapter(a);
}
//页面加载,考虑到数据获取的延迟问题
final Runnable content=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
pd.dismiss();
if(!result.isEmpty()){
//initView();
itemCount=result.size();
//数据填充,感觉重复了
pageCount=itemCount%showCount!=0?itemCount/showCount+1:itemCount/showCount;
Log.v("pageCount",pageCount+" ");
decideToShow();
}else{
TextView tv=new TextView(Main.this);
tv.setText("无数据");
setContentView(tv);
}
init();
}
};
//初始化
private void init(){
now.setText("第一页");
nowPage=1;
pre.setVisibility(View.INVISIBLE);
isLast=false;
isFirstItem=true;
isRecord=false;
}
//dialog的显示
final Runnable dialog=new Runnable(){
@Override
public void run() {
// TODO Auto-generated method stub
pd=ProgressDialog.show(Main.this,"","数据加载中", true);
}
};
//数据的显示和刷新,需要开启一个新的线程进行数据获取
//重新洗牌,很简单的
//用了太多的runnable,就是因为他娘的安卓不能在非ui线程进行ui操作
//有点蛋疼啊
private void loadContent(final int type,final boolean desc){
Log.v("loadContent",type+" "+desc);
new Thread(){
@Override
public void run(){
//加载进度条对话框
h.post(dialog);
try {
Thread.currentThread().sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//数据库查询,堵塞
result=dh.query(type,desc);
//这样写就好多了
h.post(content);
}
}.start();
}
}