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;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章