您的位置:首页 > 理论基础 > 计算机网络

ListView分页+网络下载数据

2015-07-17 14:11 387 查看
今天复习了一下以前的东西,想做一个listView 分页 ,联系一下一些第三方工具的用法。 本来简简单单的一个东西,出现了那么多的问题,不过最终还是完成了,记录下来,以后有用。

今天复习了一下以前的东西,想做一个listView 分页 ,联系一下一些第三方工具的用法。 本来简简单单的一个东西,出现了那么多的问题,不过最终还是完成了,记录下来,以后有用。

主要应用的东西:Volley(下载图片)+xUtils(访问网络)+ Gson(解析json数据)

实现功能:ListView滑动到底部自动加载数据。

下面开始贴代码:

首先是布局代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="215dp"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin" >

<com.example.chabaike.MyViewPager

android:id="@+id/viewpager_content"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</com.example.chabaike.MyViewPager>

<FrameLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:gravity="center"

android:paddingBottom="22.0dip" >

<LinearLayout

android:id="@+id/head_speck"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center"

android:orientation="horizontal" >

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1.0"

android:src="@drawable/dot_sel" />

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1.0"

android:paddingLeft="5dp"

android:src="@drawable/dot_sel" />

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1.0"

android:paddingLeft="5dp"

android:src="@drawable/dot_sel" />

</LinearLayout>

</FrameLayout>

</RelativeLayout>

<RelativeLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<ListView

android:id="@+id/listview_head_line"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</ListView>

<LinearLayout

android:id="@+id/layout_main_nextpage"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:gravity="center"

android:onClick="clickButton"

android:padding="5dp"

android:background="@color/tab_progross_on"

android:visibility="invisible" >

<ProgressBar

android:id="@+id/progressBar_bottom"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center"

android:text="@string/progross_pager_next" />

</LinearLayout>

</RelativeLayout>

</LinearLayout>

主要应用的东西:Volley(下载图片)+xUtils(访问网络)+ Gson(解析json数据)

实现功能:ListView滑动到底部自动加载数据。

下面开始贴代码:

首先是布局代码:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical" >

<RelativeLayout

android:layout_width="match_parent"

android:layout_height="215dp"

android:paddingBottom="@dimen/activity_vertical_margin"

android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin"

android:paddingTop="@dimen/activity_vertical_margin" >

<com.example.chabaike.MyViewPager

android:id="@+id/viewpager_content"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</com.example.chabaike.MyViewPager>

<FrameLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:layout_centerHorizontal="true"

android:gravity="center"

android:paddingBottom="22.0dip" >

<LinearLayout

android:id="@+id/head_speck"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center"

android:orientation="horizontal" >

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1.0"

android:src="@drawable/dot_sel" />

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1.0"

android:paddingLeft="5dp"

android:src="@drawable/dot_sel" />

<ImageView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_weight="1.0"

android:paddingLeft="5dp"

android:src="@drawable/dot_sel" />

</LinearLayout>

</FrameLayout>

</RelativeLayout>

<RelativeLayout

android:layout_width="fill_parent"

android:layout_height="fill_parent" >

<ListView

android:id="@+id/listview_head_line"

android:layout_width="match_parent"

android:layout_height="match_parent" >

</ListView>

<LinearLayout

android:id="@+id/layout_main_nextpage"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_alignParentBottom="true"

android:gravity="center"

android:onClick="clickButton"

android:padding="5dp"

android:background="@color/tab_progross_on"

android:visibility="invisible" >

<ProgressBar

android:id="@+id/progressBar_bottom"

android:layout_width="wrap_content"

android:layout_height="wrap_content" />

<TextView

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:gravity="center"

android:text="@string/progross_pager_next" />

</LinearLayout>

</RelativeLayout>

</LinearLayout>

item布局代码就不贴了。

然后是Fragment代码:

package com.example.chabaike;

import java.util.ArrayList;

import java.util.List;

import com.eample.bean.HeadLineBean;

import com.eample.bean.HeadLineBean.DataBean;

import com.example.adapter.ContentListViewAdapter;

import com.example.adapter.HeadImageViewPagerAdapter;

import com.google.gson.Gson;

import com.lidroid.xutils.HttpUtils;

import com.lidroid.xutils.ViewUtils;

import com.lidroid.xutils.exception.HttpException;

import com.lidroid.xutils.http.RequestParams;

import com.lidroid.xutils.http.ResponseInfo;

import com.lidroid.xutils.http.callback.RequestCallBack;

import com.lidroid.xutils.http.client.HttpRequest;

import com.lidroid.xutils.view.annotation.ViewInject;

import android.os.Bundle;

import android.support.v4.app.Fragment;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

import android.util.Log;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.AbsListView;

import android.widget.AbsListView.OnScrollListener;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ListView;

public class ContentFragment extends Fragment {

@ViewInject(R.id.listview_head_line)

ListView mListView;

@ViewInject(R.id.viewpager_content)

ViewPager mViewPager;

@ViewInject(R.id.head_speck)

LinearLayout mLayoutHeadSpeck;

@ViewInject(R.id.layout_main_nextpage)

LinearLayout mLayoutNextPage;

// 放头部viewpager的三张图片

List<ImageView> mImageList;

List<DataBean> mDataList;

ImageView[] mHeadDot;

// 页数

private int pager = 1;

// 每页显示的条数

private int rows = 15;

private int HEADDOTNUMBER = 3;

// 是否是最后一条

private boolean isBottom = false;

private ContentListViewAdapter mAdapter;

@Override

public void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

}

@Override

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

View view = inflater.inflate(R.layout.head_line, container, false);

ViewUtils.inject(this, view);

initHeadViewPager();

//访问网络下载数据

getListData();

mListView.setOnScrollListener(new OnScrollListener() {

@Override

public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

if (firstVisibleItem + visibleItemCount == totalItemCount) {

isBottom = true;

} else {

isBottom = false;

}

}

@Override

public void onScrollStateChanged(AbsListView view, int scrollState) {

if (isBottom && scrollState == 0) {

mLayoutNextPage.setVisibility(View.VISIBLE);

pager++;

getListData();

} else {

isBottom = false;

mLayoutNextPage.setVisibility(View.INVISIBLE);

}

Log.i("zhangyongpeng", "isBottom"+isBottom);

}

});

return view;

}

public List<DataBean> getListData() {

Log.i("zhangyongpeng", "getListData");

HttpUtils hUtils = new HttpUtils();

RequestParams requestParams = new RequestParams();

requestParams.addBodyParameter("page", String.valueOf(pager));

requestParams.addBodyParameter("rows", String.valueOf(rows));

String mUrl = MyConfig.HEADLIST_URL;

hUtils.send(HttpRequest.HttpMethod.POST, mUrl, requestParams, new RequestCallBack<String>() {

@Override

public void onLoading(long total, long current, boolean isUploading) {

}

@Override

public void onSuccess(ResponseInfo<String> responseInfo) {

Log.i("zhangyongpeng", "onSuccess");

// 得到json数据,解析json

Gson gson = new Gson();

// 拿到集合

mDataList = new ArrayList<HeadLineBean.DataBean>();

mDataList = gson.fromJson(responseInfo.result, HeadLineBean.class).getData();

if (pager == 1) {

Log.i("zhangyongpeng", "mDataList" + mDataList.size());

mAdapter = new ContentListViewAdapter(mDataList, getActivity());

mListView.setAdapter(mAdapter);

} else {

mAdapter.setMoreList(mDataList);

}

mLayoutNextPage.setVisibility(View.INVISIBLE);

}

@Override

public void onStart() {

}

@Override

public void onFailure(HttpException error, String msg) {

}

});

return mDataList;

}

public void initHeadViewPager() {

mHeadDot = new ImageView[3];

mImageList = new ArrayList<ImageView>();

for (int i = 0; i < HEADDOTNUMBER; i++) {

mHeadDot[i] = (ImageView) mLayoutHeadSpeck.getChildAt(i);

}

mViewPager.setAdapter(new HeadImageViewPagerAdapter(mImageList));

mViewPager.setOnPageChangeListener(new OnPageChangeListener() {

@Override

public void onPageSelected(int arg0) {

for (int i = 0; i < HEADDOTNUMBER; i++) {

mLayoutHeadSpeck.getChildAt(i).setEnabled(false);

}

mLayoutHeadSpeck.getChildAt(arg0).setEnabled(true);

}

@Override

public void onPageScrolled(int arg0, float arg1, int arg2) {

}

@Override

public void onPageScrollStateChanged(int arg0) {

}

});

// Get请求访问网络下载图片

}

}

适配器的代码:

package com.example.adapter;

import java.util.List;

import com.android.volley.RequestQueue;

import com.android.volley.toolbox.ImageLoader;

import com.android.volley.toolbox.NetworkImageView;

import com.android.volley.toolbox.Volley;

import com.eample.bean.HeadLineBean.DataBean;

import com.eample.helper.ImageCacheManger;

import com.example.chabaike.R;

import com.lidroid.xutils.ViewUtils;

import com.lidroid.xutils.view.annotation.ViewInject;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.TextView;

public class ContentListViewAdapter extends BaseAdapter {

private RequestQueue mRequestQueue;

private List<DataBean> mList;

private Context mContext;

public ContentListViewAdapter(List<DataBean>list,Context mContext){

this.mList = list;

this.mContext = mContext;

mRequestQueue = Volley.newRequestQueue(mContext);

}

@Override

public int getCount() {

return mList.size();

}

@Override

public Object getItem(int arg0) {

return mList.get(arg0);

}

@Override

public long getItemId(int arg0) {

return arg0;

}

@Override

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder mViewHolder = null;

if(convertView == null){

mViewHolder = new ViewHolder();

LayoutInflater inflater = LayoutInflater.from(mContext);

convertView = inflater.inflate(R.layout.content_list_item, null, true);

mViewHolder.mTextView_title = (TextView) convertView.findViewById(R.id.textView_title);

mViewHolder.mTextView_source = (TextView) convertView.findViewById(R.id.textView_source);

mViewHolder.mTextView_nickname = (TextView) convertView.findViewById(R.id.textView_nickname);

mViewHolder.mTextView_create_time = (TextView) convertView.findViewById(R.id.textView_create_time);

mViewHolder.mImageView_wap_thumb = (NetworkImageView) convertView.findViewById(R.id.imageView_wap_thumb);

convertView.setTag(mViewHolder);

}else{

mViewHolder = (ViewHolder) convertView.getTag();

}

mViewHolder.mTextView_title.setText(mList.get(position).getTitle());

mViewHolder.mTextView_source.setText(mList.get(position).getSource());

mViewHolder.mTextView_nickname.setText(mList.get(position).getNickname());

mViewHolder.mTextView_create_time.setText(mList.get(position).getCreate_time());

mViewHolder.mImageView_wap_thumb.setDefaultImageResId(R.drawable.defaultcovers);

mViewHolder.mImageView_wap_thumb.setImageUrl(mList.get(position).getWap_thumb(),

new ImageLoader(mRequestQueue, ImageCacheManger.getInstance()));

return convertView;

}

class ViewHolder{

private TextView mTextView_title;

private TextView mTextView_source;

private TextView mTextView_nickname;

private TextView mTextView_create_time;

private NetworkImageView mImageView_wap_thumb;

}

public void setMoreList(List<DataBean> moreDataList) {

if (moreDataList != null) {

mList.addAll(moreDataList);

notifyDataSetChanged();

}

}

}

OK完成!!!再次对错误进行一个总结:

1.

要在一下方法里进行setAdapter(),之前我是弄了两个集合,,totalList来接收mDataList,把mDataList返回,可是总是为空,应该是线程的原因,也不想太多的纠结,把代码改成了这样。

2.

实现功能以后,滑动几下就会 OOM,找了半天原因,原来是把volley new RequestQueue()放到了getView方法里面,每次调用getView方法的时候就会new一个新的请求队列。

改成这样。。

Ok!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: