澳门新葡萄京娱乐场 1

android使用SwipeRefreshLayout实现ListView下拉刷新上拉加载

近期因为项目的需要,研究了一下Android文件下载进度显示的功能实现,接下来就和大家一起分享学习一下,希望对广大初学者有帮助。先上效果图:

本文实例为大家分享了android实现ListView下拉刷新上拉加载的具体代码,供大家参考,具体内容如下

澳门新葡萄京娱乐场 1

澳门新葡萄京娱乐场 2

上方的蓝色进度条,会根据文件下载量的百分比进行加载,中部的文本控件用来现在文件下载的百分比,最下方的ImageView用来展示下载好的文件,项目的目的就是动态向用户展示文件的下载量。

这次使用的是系统的SwipeRefreshLayout实现下拉刷新,和设置ListView的滑动监听判断是否滑动到最底部然后加载更多;
这个要比PullToRefreshListView简单很多,想PullToRefreshListView实现下拉刷新上拉加载的可以看这篇博客:
android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多

下面看代码实现:首先是布局文件:

至于使用哪一种大家可以根据产品的需求选择,这两种刷新目前为止世面上还是使用PullToRefreshListView的比较多;

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <ProgressBar
        android:id="@+id/progressBar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/progressBar"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="24dp"
        android:text="TextView" />

    <ImageView
        android:id="@+id/imageView"
        android:layout_marginTop="24dp"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_below="@+id/textView"
        android:contentDescription="@string/app_name"
        android:src="@drawable/ic_launcher" />

</RelativeLayout>

首先说下SwipeRefreshLayout的五个方法:

澳门新葡萄京娱乐场 ,接下来的主Activity代码:

1、setOnRefreshListener():设置手势滑动监听器。
2、setProgressBackgroundColor():设置进度圈的背景色。
3、setColorSchemeResources():设置进度动画的颜色。
4、setRefreshing():设置组件的刷洗状态。
5、setSize():设置进度圈的大小

public class MainActivity extends Activity {

    ProgressBar pb;   
    TextView tv; 
    ImageView imageView;
    int fileSize;    
    int downLoadFileSize;    
    String fileEx,fileNa,filename;  
    //用来接收线程发送来的文件下载量,进行UI界面的更新
    private Handler handler = new Handler(){    
        @Override    
        public void handleMessage(Message msg)    
        {//定义一个Handler,用于处理下载线程与UI间通讯
          if (!Thread.currentThread().isInterrupted())
          {    
            switch (msg.what)
            {    
              case 0:    
                pb.setMax(fileSize);
              case 1:    
                pb.setProgress(downLoadFileSize);    
                int result = downLoadFileSize * 100 / fileSize;    
                tv.setText(result + "%");    
                break;    
              case 2:    
                Toast.makeText(MainActivity.this, "文件下载完成", Toast.LENGTH_SHORT).show();   
                FileInputStream fis = null;
                try {
                    fis = new FileInputStream(Environment.getExternalStorageDirectory() + File.separator + "/ceshi/" + filename);
                } catch (FileNotFoundException e) {
                    e.printStackTrace();
                }
                Bitmap bitmap = BitmapFactory.decodeStream(fis);  ///把流转化为Bitmap图
                imageView.setImageBitmap(bitmap);
                break;    

              case -1:    
                String error = msg.getData().getString("error");
                Toast.makeText(MainActivity.this, error, Toast.LENGTH_SHORT).show();    
                break;    
            }    
          }    
          super.handleMessage(msg);    
        }    
      };

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pb=(ProgressBar)findViewById(R.id.progressBar);
        tv=(TextView)findViewById(R.id.textView);
        imageView = (ImageView) findViewById(R.id.imageView);
        tv.setText("0%");
        new Thread(){
            public void run(){
                try {
                    //下载文件,参数:第一个URL,第二个存放路径
                    down_file("http://cdnq.duitang.com/uploads/item/201406/15/20140615203435_ABQMa.jpeg", Environment.getExternalStorageDirectory() + File.separator + "/ceshi/");
                } catch (ClientProtocolException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }   
            }    
        }.start();    

    }    

    /**
     * 文件下载
     * @param url:文件的下载地址
     * @param path:文件保存到本地的地址
     * @throws IOException
     */
    public void down_file(String url,String path) throws IOException{    
        //下载函数          
        filename=url.substring(url.lastIndexOf("/") + 1);
        //获取文件名    
        URL myURL = new URL(url);
        URLConnection conn = myURL.openConnection();    
        conn.connect();    
        InputStream is = conn.getInputStream();    
        this.fileSize = conn.getContentLength();//根据响应获取文件大小    
        if (this.fileSize <= 0) throw new RuntimeException("无法获知文件大小 ");    
        if (is == null) throw new RuntimeException("stream is null"); 
        File file1 = new File(path);
        File file2 = new File(path+filename);
        if(!file1.exists()){
            file1.mkdirs();
        }
        if(!file2.exists()){
            file2.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(path+filename);    
        //把数据存入路径+文件名    
        byte buf[] = new byte[1024];
        downLoadFileSize = 0;    
        sendMsg(0);    
        do{    
            //循环读取    
            int numread = is.read(buf);    
            if (numread == -1)    
            {    
              break;    
            }    
            fos.write(buf, 0, numread);    
            downLoadFileSize += numread;    

            sendMsg(1);//更新进度条    
        } while (true);  

        sendMsg(2);//通知下载完成    

        try{    
            is.close();    
        } catch (Exception ex) {    
            Log.e("tag", "error: " + ex.getMessage(), ex);    
        }    

    }    

    //在线程中向Handler发送文件的下载量,进行UI界面的更新
    private void sendMsg(int flag)    
    {    
        Message msg = new Message();    
        msg.what = flag;    
        handler.sendMessage(msg);    
    }        

}

这个大家简单了解一下,下面代码中都一一用到;

最后一定要注意的是:在AndroidManifest.xml文件中,添加访问网络的权限

首先说下布局文件,如果想用SwipeRefreshLayout实现下拉刷新必须把ListView写到SwipeRefreshLayout布局里面;

<uses-permission android:name="android.permission.INTERNET"/>
<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:id="@+id/srfl"> 

 <ListView 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:id="@+id/listview" /> 
</android.support.v4.widget.SwipeRefreshLayout> 

到这里关于Android文件下载动态显示下载进度的小demo就为大家分享完毕,希望对大家的学习有所帮助。

我这边是自己写的小Demo所以下拉的时候直接发送一个延时1秒的handler,然后添加数据刷新adapter;
上拉加载更多的时候直接给ListVIew设置了一个滑动监听,判断是否滑动到adapter的最下面,然后加载数据,刷新adapter;

public class MainActivity extends Activity { 
 private ListView mListView; 
 private SwipeRefreshLayout swipeRefreshLayout; 
 private List<String> stringList=new ArrayList<>(); 
 private ArrayAdapter<String> adapter; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 

  for (int x=0 ; x<16;x++){ 
   stringList.add("新浪微博:搏击爱好者Z"+"---"+x); 
  } 
  initView(); 
 } 

 private void initView() { 
  swipeRefreshLayout= (SwipeRefreshLayout) findViewById(R.id.srfl); 
  //设置进度圈的大小;(这里面只有两个值SwipeRefreshLayout.LARGE和DEFAULT,后者是默认效果) 
  swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE); 
  //设置进度圈的背景色。这里随便给他设置了一个颜色:浅绿色 
  swipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.CYAN); 
  //设置进度动画的颜色。这里面最多可以指定四个颜色,我这也是随机设置的,大家知道怎么用就可以了 
  swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_orange_dark 
    ,android.R.color.holo_blue_dark 
    ,android.R.color.holo_red_dark 
    ,android.R.color.widget_edittext_dark); 
  mListView= (ListView) findViewById(R.id.listview); 
  adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, stringList); 
  mListView.setAdapter(adapter); 

  //设置手势滑动监听器 
  swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
   public void onRefresh() { 
    //发送一个延时1秒的handler信息 
    handler.sendEmptyMessageDelayed(199,1000); 
   } 
  }); 

  //给listview设置一个滑动的监听 
  mListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
   //当滑动状态发生改变的时候执行 
   public void onScrollStateChanged(AbsListView view, int scrollState) { 
    switch (scrollState){ 
     //当不滚动的时候 
     case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: 

      //判断是否是最底部 
      if(view.getLastVisiblePosition()==(view.getCount())-1){ 
       for(int x=0;x<5;x++){ 
        stringList.add(stringList.size(),"魔兽世界"+x); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
      break; 
    } 
   } 
   //正在滑动的时候执行 
   public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
   } 
  }); 
 } 

 private Handler handler=new Handler(){ 
  @Override 
  public void handleMessage(Message msg) { 
   if(msg.what==199){ 
    stringList.add(0,"英雄联盟"); 
    adapter.notifyDataSetChanged(); 
    //设置组件的刷洗状态;false代表关闭 
    swipeRefreshLayout.setRefreshing(false); 
   } 
  } 
 }; 
} 

这里面为了给大家演示SwipeRefreshLayout的几个方法,如果全部使用默认可以把setProgressBackgroundColor():setColorSchemeResources():setSize():这三个方法去掉。
这样代码会更少,默认效果也非常不错,这个看大家需求。

源码下载地址.rar)

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

  • android
    listview进阶实例分享
  • android
    listview初步学习实例代码
  • Android
    ListView实现下拉顶部图片变大效果
  • Android
    ListView与RecycleView的对比使用解析
  • Android开发实现仿QQ消息SwipeMenuListView滑动删除置顶功能【附源码下载】
  • android使用PullToRefresh框架实现ListView下拉刷新上拉加载更多
  • Android开发listview选中高亮简单实现代码分享

发表评论

电子邮件地址不会被公开。 必填项已用*标注