1.下载XListView的Demo
http://download.csdn.net/detail/and_hl/9563537
2.打开Demo找到src中的view文件夹,将里面的三个java文件拷贝到自己的项目工程中,此时文件会报错,再去Demo中找到res文件中的layout,把其中的xlistview_footer.xml和xlistview_header.xml两个xml文件拷贝到自己的layout文件中,再去Demo中找到res文件中的values文件中的strings.xml文件中的字符串资源拷贝下来,别忘了去刚才拷贝的三个java文件中导入本工程的 R 文件
3. 下面就可以开始编写代码了
创建自己的布局文件 并对XListView进行引用,找到刚才拷贝的三个java文件,拷贝XListView.java文件的全路径。
<com.example.xlistview.XListView
android:id="@+id/listView1"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
</com.example.xlistview.XListView>
4. 在Activity中
xListView = (XListView) view.findViewById(R.id.listView1);
xListView.setPullRefreshEnable(true);//支持下拉刷新
xListView.setPullLoadEnable(true);//支持加载更多
xListView.setXListViewListener(XListViewListener listener); //注意!!!此时设置的是 XListView的监听
设置监听 重写两个方法onRefresh()和onLoadMore(),当触发下拉刷新事件的时候就会回调onRefresh()方法,上拉加载的时候会回调onLoadMore()方法 在其中进行自己的逻辑处理。
自己的逻辑写完后不要忘记调用两个停止的方法,不然刷新或加载的动画会一直不消失
xListView.stopLoadMore();//停止加载更多
xListView.stopRefresh();//停止刷新
!!还可以设置上次刷新的时间
xListView.setRefreshTime(getTime());
/**
* 当前的时间
*/
public String getTime(){
SimpleDateFormat format=new SimpleDateFormat("hh:mm:ss");
Date date=new Date();
String time = format.format(date);
return time;
LinkedList<News> list;
ArrayList<News> arrlist;
private MyListViewAdapter adapter;
private XListView xListView;
private int Index = 1;
@SuppressLint("HandlerLeak")
private Handler handler = new Handler(){
@SuppressWarnings("unchecked")
public void handleMessage(Message msg) {
int what = msg.what;
switch (what) {
case 1:
list = (LinkedList<News>) msg.obj;
arrlist = new ArrayList<News>(list);
adapter = new MyListViewAdapter(list, mainActivity);
xListView.setAdapter(adapter);
break;
case 2:
for (News item : (LinkedList<News>) msg.obj) {
list.addFirst(item);
}
adapter.notifyDataSetChanged();
OverLoad();
break;
case 3:
for (News item : (LinkedList<News>) msg.obj) {
list.addLast(item);
}
adapter.notifyDataSetChanged();
OverLoad();
break;
default:
break;
}
};
};
@Override
public View initView() {
View view = View.inflate(mainActivity, R.layout.xlistview_view, null);
xListView = (XListView) view.findViewById(R.id.listView1);
xListView.setPullRefreshEnable(true);
xListView.setPullLoadEnable(true);
new Thread(){
public void run() {
sendMessage(1, 15, 1);
};
}.start();
xListView.setXListViewListener(new IXListViewListener() {
@Override
public void onRefresh() {
new Thread(){
public void run() {
sendMessage(1, 15, 2);
};
}.start();
}
@Override
public void onLoadMore() {
new Thread(){
public void run() {
sendMessage(++Index, 15, 3);
};
}.start();
}
});
return view;
}
private void OverLoad(){
xListView.stopLoadMore();
xListView.stopRefresh();
xListView.setRefreshTime(getTime());
}
@SuppressLint("SimpleDateFormat")
public String getTime(){
SimpleDateFormat format=new SimpleDateFormat("hh:mm:ss");
Date date=new Date();
String time = format.format(date);
return time;
}
/**
* 发送消息 通知Handler处理信息
* @param pageIndex 要请求数据的哪一页
* @param pageSize 要请求数据的条数
* @param flag 标志 判断是初始化 刷新 加载更多
*/
private void sendMessage(int pageIndex, int pageSize, int flag){
LinkedList<News> linkedList = GetData(pageIndex, pageSize);
Message msg = Message.obtain();
msg.what = flag;
msg.obj = linkedList;
handler.sendMessage(msg);
}
/**
* 请求网络数据
* @param pageIndex 要请求数据的哪一页
* @param pageSize 要请求数据的条数
* @return 集合数据
*/
private LinkedList<News> GetData(int pageIndex, int pageSize){
String spec = "http://www.oschina.net/action/api/news_list?catalog=1&pageIndex=" + pageIndex + "&pageSize=" + pageSize;
LinkedList<News> news = null;
News item = null;
try {
URL url = new URL(spec);//统一资源定位
HttpURLConnection openConnection = (HttpURLConnection) url.openConnection();// 打开连接
XmlPullParser parser = Xml.newPullParser();
parser.setInput(new InputStreamReader(openConnection.getInputStream()));
int eventType = parser.getEventType();
while (eventType != XmlPullParser.END_DOCUMENT ) {
switch (eventType) {
case XmlPullParser.START_TAG:
if("newslist".equals(parser.getName())){
news = new LinkedList<News>();
}else if("news".equals(parser.getName())){
item = new News();
}else if("id".equals(parser.getName())){
item.setId(Integer.parseInt(parser.nextText()));
}else if("title".equals(parser.getName())){
item.setTitle(parser.nextText());
}else if("body".equals(parser.getName())){
item.setBody(parser.nextText());
}else if("commentCount".equals(parser.getName())){
item.setCommentCount(Integer.parseInt(parser.nextText()));
}else if("author".equals(parser.getName())){
item.setAuthor(parser.nextText());
}else if("pubDate".equals(parser.getName())){
item.setPubDate(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if("news".equals(parser.getName())){
news.add(item);
}
break;
default:
break;
}
eventType = parser.next();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (XmlPullParserException e) {
e.printStackTrace();
}
return news;
}
适配器:
LinkedList<News> list;
Context context;
public MyListViewAdapter(LinkedList<News> list, Context context) {
super();
this.list = list;
this.context = context;
}
@Override
public int getCount() {
return list.size();
}
@Override
public Object getItem(int position) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@SuppressLint("ViewHolder")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// 加载布局
View view = LayoutInflater.from(context).inflate(R.layout.adapter_item, null);
// 找控件
TextView tv1 = (TextView) view.findViewById(R.id.textView1);
TextView tv2 = (TextView) view.findViewById(R.id.textView2);
TextView tv3 = (TextView) view.findViewById(R.id.textView3);
TextView tv4 = (TextView) view.findViewById(R.id.textView4);
// 赋值
tv1.setText(list.get(position).getTitle());
tv2.setText("发布人:" + list.get(position).getAuthor());
tv3.setText("发布于:" + list.get(position).getPubDate());
tv4.setText("评论:" + list.get(position).getCommentCount());
return view;
}