• [Android学习系列15]下拉刷新列表实现动态加载


     实现方案:

    使用google官方的SwipeRefreshLayout

    参考:

    http://blog.csdn.net/easyer2012/article/details/22857807

    http://stormzhang.github.io/android/2014/03/29/android-swiperefreshlayout/

    http://www.eoeandroid.com/thread-330439-1-1.html

     http://www.oschina.net/translate/swipe-to-refresh-added-to-android-support-v4-component

    使用开源控件PullToRefreshListView

    参考:

    http://my.oschina.net/sfshine/blog/140716

    http://blog.csdn.net/harvic880925/article/details/17680305

    https://github.com/chrisbanes/Android-PullToRefresh

    使用ActionBar-PullToRefresh开源控件

    参考:

    http://www.tutecentral.com/android-pull-to-refresh/

    http://www.youtube.com/watch?v=JfJM1jQsZRM

    小代码练习:

    用 SwipeRefreshLayout  +   android-async-http  +  gson   实现网络加载数据

    package com.example.testwipe;
    
    public class Book {
        
        int bookid;
        String bookname;
        String bookinfo;
        
        Book(int id, String name, String info) {
            this.bookid = id;
            this.bookname = name;
            this.bookinfo = info;
        }
    
    }
    
    
    
    -----------------------------------------------------------------------------------
    
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:paddingBottom="10dp"    
         >
        
        <TextView 
            android:id="@+id/booktitle"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#6FB3E0"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:textColor="#fff"
            android:gravity="center"
            
            />
        
        <TextView 
            android:id="@+id/bookinfo"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:background="#fff"
            android:paddingTop="5dp"
            android:paddingBottom="5dp"
            android:textColor="#0000EE"
            android:gravity="center"
            android:layout_below="@id/booktitle"
            />
        
       
    </LinearLayout>
    
    -------------------------------------------------------------------------------
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        tools:context=".MainActivity" >
        
        
          
            <ListView  
                android:id="@+id/listview"  
                android:layout_width="fill_parent"  
                android:layout_height="fill_parent"
                 >  
            </ListView>  
            
            
            <!--
                <android.support.v4.widget.SwipeRefreshLayout  
                    android:id="@+id/swipe_refresh"  
                    android:layout_width="match_parent"  
                    android:layout_height="match_parent" >  
                </android.support.v4.widget.SwipeRefreshLayout> 
    
                    -->
    
    </LinearLayout>
    
    ---------------------------------------------------------------------------------
    package com.example.testwipe;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class MainActivity extends Activity {
    
        
        public List<Book> listBooks;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            ListView listview = (ListView)findViewById(R.id.listview);
            listBooks = new ArrayList<Book>();
            
            listBooks.add( new Book(1, "呵呵", "介绍") );
            listBooks.add( new Book(2, "呵呵", "介绍") );
            listBooks.add( new Book(3, "呵呵", "介绍") );
            
            listview.setAdapter( new MyListAdapter(getApplicationContext())  );
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
        
        class MyListAdapter extends BaseAdapter {
            
            Context context;
            ArrayList<View> listViews;
            
            public MyListAdapter( Context context ) {
                this.context = context;
                LayoutInflater inflater = LayoutInflater.from(context);
                
                
                
                //把book列表的每一个数据渲染进view,然后放进一个list里, 供getView返回
                listViews = new ArrayList<View>();
                for( Book book : listBooks )
                {
                    View view = inflater.inflate(R.layout.list_one_item, null);
                    TextView tv1 = (TextView)view.findViewById(R.id.booktitle);
                    TextView tv2 = (TextView)view.findViewById(R.id.bookinfo);
                    tv1.setText( String.valueOf(book.bookid) + " " +  book.bookname );
                    tv2.setText( book.bookinfo );
                    listViews.add(view);
                }
                
                
                
            }
    
            @Override
            public int getCount() {
                return listBooks.size();
            }
    
            @Override
            public Object getItem(int arg0) {
                return arg0;
            }
    
            @Override
            public long getItemId(int arg0) {
                return arg0;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                
                return listViews.get(position);
            }
            
            
            
            
        }
    
    }
    View Code

    好吧,没有骗到你,上面的代码只是一个很普通的listview

    现在在libs文件夹 导入 gson 和 android-async-http 的包

    然后,不一一说明代码了,一大堆代码贴出来自己看啊

     1 package com.example.testwipe;
     2 
     3 public class Book {
     4     
     5     int bookid;
     6 
     7 
     8     String bookname;
     9     String bookinfo;
    10     
    11     public Book() {
    12         
    13     }
    14 
    15     
    16     public int getBookid() {
    17         return bookid;
    18     }
    19 
    20     public void setBookid(int bookid) {
    21         this.bookid = bookid;
    22     }
    23 
    24     public String getBookname() {
    25         return bookname;
    26     }
    27 
    28     public void setBookname(String bookname) {
    29         this.bookname = bookname;
    30     }
    31 
    32     public String getBookinfo() {
    33         return bookinfo;
    34     }
    35 
    36     public void setBookinfo(String bookinfo) {
    37         this.bookinfo = bookinfo;
    38     }
    39 }
    book.java
     1 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     2     xmlns:tools="http://schemas.android.com/tools"
     3     android:layout_width="fill_parent"
     4     android:layout_height="fill_parent"
     5     tools:context=".MainActivity" >
     6     
     7     <android.support.v4.widget.SwipeRefreshLayout  
     8                 android:id="@+id/swipe_refresh"  
     9                 android:layout_width="match_parent"  
    10                 android:layout_height="match_parent" >  
    11       
    12         <ListView  
    13             android:id="@+id/listview"  
    14             android:layout_width="fill_parent"  
    15             android:layout_height="fill_parent"
    16              >  
    17         </ListView>  
    18         
    19         
    20     </android.support.v4.widget.SwipeRefreshLayout> 
    21 
    22 
    23 
    24 </LinearLayout>
    activity_main.xml
     1 <?xml version="1.0" encoding="utf-8"?>
     2 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
     3     android:layout_width="fill_parent"
     4     android:layout_height="wrap_content"
     5     android:orientation="vertical"
     6     android:paddingBottom="10dp"    
     7      >
     8     
     9     <TextView 
    10         android:id="@+id/booktitle"
    11         android:layout_width="fill_parent"
    12         android:layout_height="wrap_content"
    13         android:background="#6FB3E0"
    14         android:paddingTop="5dp"
    15         android:paddingBottom="5dp"
    16         android:textColor="#fff"
    17         android:gravity="center"
    18         
    19         />
    20     
    21     <TextView 
    22         android:id="@+id/bookinfo"
    23         android:layout_width="fill_parent"
    24         android:layout_height="wrap_content"
    25         android:background="#fff"
    26         android:paddingTop="5dp"
    27         android:paddingBottom="5dp"
    28         android:textColor="#0000EE"
    29         android:gravity="center"
    30         android:layout_below="@id/booktitle"
    31         />
    32     
    33    
    34 </LinearLayout>
    list_one_item.xml
    package com.example.testwipe;
    
    import java.util.ArrayList;
    import java.util.List;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.support.v4.widget.SwipeRefreshLayout;
    import android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import com.google.gson.Gson;
    import com.loopj.android.http.AsyncHttpClient;
    import com.loopj.android.http.AsyncHttpResponseHandler;
    import com.loopj.android.http.RequestParams;
    
    public class MainActivity extends Activity {
    
        
        public ArrayList<Book> listBooks;
        private SwipeRefreshLayout swipeLayout;  
        public MyListAdapter myListAdapter;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //获得主界面的listview
            ListView listview = (ListView)findViewById(R.id.listview);
            listBooks = new ArrayList<Book>();
            
            //listBooks.add( new Book(1, "呵呵", "介绍") );
            //listBooks.add( new Book(2, "呵呵", "介绍") );
            //listBooks.add( new Book(3, "呵呵", "介绍") );
            
            //绑定适配器
            myListAdapter = new MyListAdapter(  getApplicationContext() , listBooks  );
            listview.setAdapter( myListAdapter );
            
            //建立一个swipeLayout
            swipeLayout = (SwipeRefreshLayout) this.findViewById(R.id.swipe_refresh);  
            // 顶部刷新的样式  
            swipeLayout.setColorScheme(android.R.color.holo_red_light, android.R.color.holo_green_light,android.R.color.holo_blue_bright, android.R.color.holo_orange_light);  
            swipeLayout.setOnRefreshListener( new MyOnrefreshListener() );  
           
            
        }
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
        
        
        //监听器   下拉拖动列表时触发
        class MyOnrefreshListener implements OnRefreshListener {
    
            @Override
            public void onRefresh() {
                
                
                //用async http 发个请求
                AsyncHttpClient client = new AsyncHttpClient();
                RequestParams params = new RequestParams(); // 绑定参数
                params.put("key1", "1");       //这里参数随便写 因为我发请求的那个网址不解析参数的,只是做个例子  
                params.put("key2", "2");
                
                client.get("http://taobibi.kuphp.net/index1.php?", params, new AsyncHttpResponseHandler(){
                
                    @Override
                    @Deprecated
                    public void onSuccess(String content) {
                        //因为返回了多个json  所以先把string 转成array
                        String [] stringArray = content.split("
    ");
                        
                        Gson gson = new Gson();
                        Book book;
                        for( String s : stringArray ) {
                            
                            //用Gson   把一个json字符串 解析成  对应的类的实例
                            book = gson.fromJson(s, Book.class);
                            //把实例放进listBooks里 (更新数据源)
                            listBooks.add(book);
                            Log.v( "mytag", book.bookinfo );
                            
                        }
                        
                        
                        //通知  界面的适配器  重新更新数据
                        myListAdapter.notifyDataSetChanged();
                        //更新完毕,停止swipeLayout的刷新动画
                        swipeLayout.setRefreshing(false);  
                        //Log.v("mytag", String.valueOf( listBooks.size() )  );    
                        
                    }
                    
                });
                
                
                
            
            }
            
            
        }
        
    
        
        
        class MyListAdapter extends BaseAdapter {
            
            Context context;
            ArrayList<View> listViews;
            ArrayList<Book> listBooks;
            LayoutInflater inflater;
            
            public MyListAdapter( Context context, ArrayList<Book> list ) {
                this.context = context;
                inflater = LayoutInflater.from(context);
                this.listBooks = list;
                
            }
    
            @Override
            public int getCount() {
                return listBooks.size();
            }
    
            @Override
            public Object getItem(int arg0) {
                return arg0;
            }
    
            @Override
            public long getItemId(int arg0) {
                return arg0;
            }
    
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                
                //Log.v("mytag", String.valueOf( listBooks.size() ) );
                //   listBooks.size() - position - 1 是个关键
                //   保证最新的数据显示在界面的上方,所以要逆序生成view
                 Book book = listBooks.get( listBooks.size() - position - 1  );
                View view = inflater.inflate(R.layout.list_one_item, null);
                TextView tv1 = (TextView)view.findViewById(R.id.booktitle);
                TextView tv2 = (TextView)view.findViewById(R.id.bookinfo);
                tv1.setText( String.valueOf(book.bookid) + " " +  book.bookname );
                tv2.setText( book.bookinfo );
                
                return view;
            }
            
            
            
            
        }
    
    }
    MainActivity.java

    用PullToRefreshListView  还有点小问题没有解决

    <?xml version="1.0" encoding="utf-8"?>  
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
        android:layout_width="fill_parent"  
        android:layout_height="fill_parent"  
        android:orientation="vertical" >  
          
    <!--     The PullToRefreshListView replaces a standard ListView widget. -->  
        <com.handmark.pulltorefresh.library.PullToRefreshListView  
            android:id="@+id/pull_refresh_list"  
            android:layout_width="fill_parent"  
            android:layout_height="fill_parent"  
            android:cacheColorHint="#00000000"  
            android:divider="#19000000"  
            android:dividerHeight="4dp"  
            android:fadingEdge="none"  
            android:fastScrollEnabled="false"  
            android:footerDividersEnabled="false"  
            android:headerDividersEnabled="false"  
            android:smoothScrollbar="true" />  
      
    </LinearLayout>  
    main.xml
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="vertical" >
        
        
        <TextView 
            android:id="@+id/textview1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            />
    
    </LinearLayout>
    list_one_item.xml
    package com.example.testpulltorefresh;
    
    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.content.Context;
    import android.os.Bundle;
    import android.text.format.DateUtils;
    import android.view.LayoutInflater;
    import android.view.Menu;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.BaseAdapter;
    import android.widget.ListView;
    import android.widget.TextView;
    
    import com.handmark.pulltorefresh.library.PullToRefreshBase;
    import com.handmark.pulltorefresh.library.PullToRefreshBase.Mode;
    import com.handmark.pulltorefresh.library.PullToRefreshBase.OnRefreshListener;
    import com.handmark.pulltorefresh.library.PullToRefreshBase.State;
    import com.handmark.pulltorefresh.library.PullToRefreshListView;
    
    public class MainActivity extends Activity {
    
        
        public PullToRefreshListView  pullToRefreshListView;
        public ArrayList<String> listStrings;
        public MyAdapter myAdapter;
        
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            
            listStrings = new ArrayList<String>();
            
            listStrings.add("asdasdasd");
            listStrings.add("asdasdasd");
            listStrings.add("asdasdasd");
            
            
            myAdapter =  new MyAdapter();
            //初始化pullToRefreshListView
            pullToRefreshListView = (PullToRefreshListView)findViewById(R.id.pull_refresh_list);
            //让pullToRefreshListView上下两端都可以刷新
            pullToRefreshListView.setMode(Mode.BOTH);
            //为pullToRefreshListView绑定适配器
            pullToRefreshListView.setAdapter( myAdapter );
            
            
            pullToRefreshListView.setOnRefreshListener( new OnRefreshListener<ListView>(){
    
                @Override
                public void onRefresh(PullToRefreshBase<ListView> refreshView) {
                    
                     String label = DateUtils.formatDateTime(getApplicationContext(), System.currentTimeMillis(),  
                                DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_ABBREV_ALL);  
          
                     refreshView.getLoadingLayoutProxy().setLastUpdatedLabel(label);  
                     
                    //每一次刷新 增加三个string 
                    listStrings.add("asdasdasd");
                    listStrings.add("asdasdasd");
                    listStrings.add("asdasdasd");
                     
                    
                    //通知适配器更新
                    myAdapter.notifyDataSetChanged();
                    
                    
                    pullToRefreshListView.onRefreshComplete();
                    
                }
                
    
                
                
            });
        
        }
        
        
        
        
        class MyAdapter extends BaseAdapter {
    
            @Override
            public int getCount() {
                return listStrings.size();
            }
    
            @Override
            public Object getItem(int arg0) {
                return arg0;
            }
    
            @Override
            public long getItemId(int arg0) {
                return arg0;
            }
    
            @Override
            public View getView(int arg0, View arg1, ViewGroup arg2) {
                
                LayoutInflater inflator = (LayoutInflater) MainActivity.this.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                View view = inflator.inflate(R.layout.list_one_item, null);
                TextView textView = (TextView)view.findViewById(R.id.textview1);
                textView.setText( listStrings.get(arg0) );
                
                return view;
            }
            
            
            
        }
        
        
    
        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Inflate the menu; this adds items to the action bar if it is present.
            getMenuInflater().inflate(R.menu.main, menu);
            return true;
        }
        
        
        
        
        
    
    }
    activity_main.java
  • 相关阅读:
    分布式唯一ID:雪花ID Snowflake .Net版
    jTopo HTML5 Canvas 画图组件
    运用四色建模法进行领域分析
    .netcore 分布式事务CAP2.6之控制台使用
    .netcore 分布式事务CAP2.6 快速入门
    .NetCore从零开始使用Skywalking分布式链路追踪系统
    Docker安装Skywalking APM分布式追踪系统
    ubuntu18.04安装docker
    github超级小白入门攻略
    记录AJAX充电点点滴滴
  • 原文地址:https://www.cnblogs.com/sleeptothedeath/p/3698977.html
Copyright © 2020-2023  润新知