Android实战简单新闻客户端(6)---listview的下拉刷新和上拉加载更多

下拉刷新控件: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;
    }
}

发布了85 篇原创文章 · 获赞 40 · 访问量 24万+

猜你喜欢

转载自blog.csdn.net/lw_zhaoritian/article/details/52778234