下拉刷新控件:SwipeRefreshLayout
文章: android–UI–SwipeRefreshLayout的使用
使用SwipeRefreshLayout包住listview即可:
<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/swipe_refresh_widget"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true"
app:layout_behavior="@string/appbar_scrolling_view_behavior">
<com.example.administrator.newsbyhuluwo.Activity.NestedListView
android:id="@+id/listview_news"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</com.example.administrator.newsbyhuluwo.Activity.NestedListView>
</android.support.v4.widget.NestedScrollView>
</android.support.v4.widget.SwipeRefreshLayout>
设置刷新事件:
swipeRefreshLayout=(SwipeRefreshLayout)view.findViewById(R.id.swipe_refresh_widget);
//设置刷新时动画的颜色,可以设置4个
swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_blue_light, android.R.color.holo_red_light, android.R.color.holo_orange_light, android.R.color.holo_green_light);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
new Thread(new Runnable() {
@Override
public void run() {
newsList.clear();
String redata=HttpUtils.urlConnget("http://apis.baidu.com/txapi/tiyu/tiyu?num=10&page=1");
newsList.addAll(JsonUtils.NewslistData(redata));
Message msg = new Message();
msg.what=1;
mHandler.sendMessage(msg); }
}).start();
}
});
使用handle更新UI
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 1:
swipeRefreshLayout.setRefreshing(false);
newAdapter.notifyDataSetChanged();
//设置不能刷新
// swipeRefreshLayout.setEnabled(false);
break;
default:
break;
}
}
测试:
上拉加载控件:动态添加页脚footview
写一个带progressbar的页脚:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/load_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:orientation="horizontal"
android:paddingBottom="12dip"
android:paddingTop="12dip" >
<ProgressBar
style="?android:attr/progressBarStyleSmall"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<TextView
android:id="@+id/more_data_msg"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="@color/colorAccent"
android:textSize="16sp"
android:layout_marginLeft="10dp"
android:text="正在加载..." />
</LinearLayout>
判断滑倒底部:重写滑动监听函数:
由于listview滑动事件已经禁止,所以使用外层的NestedScrollView
判断滑动事件。
参考文章:http://www.cnblogs.com/zmc/p/3601423.html
nestedScrollView=(NestedScrollView) view.findViewById(R.id.nesscrollview);
nestedScrollView.setOnTouchListener(new TouchListenerImpl() );
private class TouchListenerImpl implements View.OnTouchListener {
@Override
public boolean onTouch(View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_MOVE:
int scrollY=view.getScrollY();
int height=view.getHeight();
int scrollViewMeasuredHeight=nestedScrollView.getChildAt(0).getMeasuredHeight();
if(scrollY==0){
System.out.println("滑动到了顶端 view.getScrollY()="+scrollY);
}
if((scrollY+height)==scrollViewMeasuredHeight){
System.out.println("滑动到了底部 scrollY="+scrollY);
System.out.println("滑动到了底部 height="+height);
System.out.println("滑动到了底部 scrollViewMeasuredHeight="+scrollViewMeasuredHeight);
//加载之前添加页脚
listView.addFooterView(footer);
new Thread(new Runnable() {
@Override
public void run() {
String redata = HttpUtils.urlConnget("http://apis.baidu.com/txapi/tiyu/tiyu?num=10&page=1");
Message msg = new Message();
msg.obj=JsonUtils.NewslistData(redata);
msg.what = 2;
mHandler.sendMessage(msg);
}
}).start();
}
break;
default:
break;
}
return false;
}
};
测试:
listview的优化:
使用过程中listview崩溃,需进行优化。
public class NewAdapter extends ArrayAdapter<News>{
private int resourceID;
public NewAdapter(Context context, int textviewresourceid, List<News> object){
super(context,textviewresourceid,object);
resourceID=textviewresourceid;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
News news=getItem(position);//获取当前项的wanwan实例
View view;
ViewHolder viewHolder;
if(convertView==null) {
view=LayoutInflater.from(getContext()).inflate(resourceID, null);//获取view实例
viewHolder=new ViewHolder();
viewHolder.networkImageView=(NetworkImageView) view.findViewById(R.id.news_pic);
viewHolder.textView1=(TextView) view.findViewById(R.id.text_title);
viewHolder.textView2=(TextView) view.findViewById(R.id.text_content);
view.setTag(viewHolder);
}
else {
view=convertView;
viewHolder=(ViewHolder) view.getTag();
}
//imgview.setImageResource(news.getPicurl());
viewHolder.textView1.setText(news.getTitle());
viewHolder.textView2.setText(news.getDescription());
Log.d("PIC",news.getPicurl());
RequestQueue mQueue = Volley.newRequestQueue(getContext());
ImageLoader imageLoader = new ImageLoader(mQueue, new ImageLoader.ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
@Override
public Bitmap getBitmap(String url) {
return null;
}
});
viewHolder.networkImageView.setDefaultImageResId(R.mipmap.ic_launcher);
viewHolder.networkImageView.setErrorImageResId(R.mipmap.ic_launcher);
viewHolder.networkImageView.setImageUrl(news.getPicurl(),
imageLoader);
return view;
}
class ViewHolder{
TextView textView1;
TextView textView2;
NetworkImageView networkImageView;
}
}