这个工程由两部分组成,包括服务器端和客户端。在服务器端生成JSON数据,在客户端把JSON数据从服务器取出来,然后解析。下载数据时采用异步任务方式,在ViewPager中加入Fragment显示,并且添加sroll属性,在下划的过程中不断加载数据。
所以,这个例子中用到的知识点比较多,有 服务器、JSON、ViewPager,Fragment,AsyncTask,OnScrollListener,HTTP,BaseAdapter。
1)客户端
1. MainActivity
在activity_main.xml布局中加入 ViewPager和PagerTitleStrip
2)Fragment1
还随便定义了一个页面Fragment2,自定义一些布局。
所以,这个例子中用到的知识点比较多,有 服务器、JSON、ViewPager,Fragment,AsyncTask,OnScrollListener,HTTP,BaseAdapter。
1)客户端
1. MainActivity
在activity_main.xml布局中加入 ViewPager和PagerTitleStrip
public class MainActivity extends FragmentActivity {
private ViewPager viewPager;
private List<Fragment> items;
private List<String> titles;
private MyFragmentPagerAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
viewPager = (ViewPager) this.findViewById(R.id.viewpager);
items = new ArrayList<Fragment>();
Fragment1 fragment1 = new Fragment1();
Fragment2 fragment2 = new Fragment2();
items.add(fragment1);
items.add(fragment2);
titles = new ArrayList<String>();
titles.add("第一个页面");
titles.add("第二个页面");
adapter = new MyFragmentPagerAdapter(getSupportFragmentManager());
viewPager.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
public class MyFragmentPagerAdapter extends FragmentPagerAdapter {
public MyFragmentPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int arg0) {
return items.get(arg0);
}
@Override
public CharSequence getPageTitle(int position) {
return titles.get(position);
}
@Override
public int getCount() {
return items.size();
}
}
}
这里继承的是FragmentActivity。
2)Fragment1
public class Fragment1 extends ListFragment implements OnScrollListener {
private String path = "http://192.168.0.100:8080/viewpager/servlet/CityAction?pageNo="; //从网页获得JSON数据
private static int pageNo = 1;// 默认是第一页
private List<String> total_list;
private MyAdapter adapter;
private boolean is_scrolling = false;// 是否需要滚动
@Override
public void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
adapter = new MyAdapter();
new MyTask().execute(path + pageNo);
}
public class MyTask extends AsyncTask<String, Void, List<String>> {
@Override
protected List<String> doInBackground(String... params) {
List<String> list = new ArrayList<String>();
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost(params[0]);
HttpResponse response = null;
try {
response = httpClient.execute(httpPost);
if (response.getStatusLine().getStatusCode() == 200) {
String jsonString = EntityUtils.toString(response.getEntity(), "utf-8");
JSONArray jsonArray = new JSONObject(jsonString).getJSONArray("citys");
for (int i = 0; i < jsonArray.length(); i++) {
list.add(jsonArray.getString(i));
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
httpClient.getConnectionManager().shutdown();
}
return list;
}
@Override
protected void onPostExecute(List<String> result) {
super.onPostExecute(result);
// 调用适配器绑定数据
adapter.bindData(result);
setListAdapter(adapter);
adapter.notifyDataSetChanged();
pageNo++;// 页码加一
}
}
public class MyAdapter extends BaseAdapter { //自定义的适配器
private List<String> list;
public void bindData(List<String> list) {
this.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) {
View view = null;
if (convertView == null) {
view = LayoutInflater.from(getActivity()).inflate(R.layout.item, null);
} else {
view = convertView;
}
TextView textView = (TextView) view.findViewById(R.id.textView1);
textView.setText(list.get(position));
return view;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.f1, null);
return view;
}
@Override
public void onPause() {
super.onPause();
}
@Override
public void onResume() {
super.onResume();
getListView().setOnScrollListener(this);
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// 表示用户不在滑动屏幕
if (is_scrolling && OnScrollListener.SCROLL_STATE_IDLE == scrollState) {
new MyTask().execute(path + pageNo);
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (firstVisibleItem + visibleItemCount == totalItemCount
&& totalItemCount != 0) {
is_scrolling = true;
} else {
is_scrolling = false;
}
}
}
有4个不同的网面,分别有不同的数据,通过pageNo 取得不同的数据。还随便定义了一个页面Fragment2,自定义一些布局。