整合了刷新、加载更多、滑动删除功能的XListview

来源:互联网 发布:mac如何建立文件夹 编辑:程序博客网 时间:2024/05/22 15:32

   如果想做带有刷新、加载更多功能的listview,我们可以使用XListview。(已经停止维护,github地址:https://github.com/Maxwin-z/XListView-Android)

    如果想做带有滑动删除功能的listview,我们可以使用SwipeListview。(github地址:https://github.com/47deg/android-swipelistview)

    如果想做刷新、加载更多、滑动删除的listview呢?抱歉,我暂时还没有发现同时拥有这些功能的listview。不过,我们可以整合多个开源项目,做出这样的效果。

    如果要实现这个功能,我们需要两个开源项目的配合,一个就是XListview,来实现刷新加载功能,而滑动删除功能,我们则需要另外一个大神的开源项目,AndroidSwipeLayout(github地址:https://github.com/daimajia/AndroidSwipeLayout)。

    话不多说,我们先看一下做出来的效果。



     我感觉效果很不错,对于一般的开发需求来说,已经够了,下面,我们看一下项目的集成过程。

    下面是整个项目的结构。



    daimajia.swipe是AndroidSwipeLayout的代码,me.maxwin.view是XListview的代码,不需要再导入其他的lib包了。

    layout文件夹下面的xlistview_footer,xlistview_header是XListview项目需要的布局文件,values文件夹下面的attrs是

SwipeLayout一些预置参数,colors是用到的两个颜色值,strings是XListview用到的字符串常量。

    介绍完一些重要的文件夹,我们看一下ListViewAdapter的代码实现。

    

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. import android.content.Context;  
  2. import android.view.LayoutInflater;  
  3. import android.view.View;  
  4. import android.view.View.OnClickListener;  
  5. import android.view.ViewGroup;  
  6. import android.widget.TextView;  
  7. import android.widget.Toast;  
  8.   
  9. import com.daimajia.swipe.SimpleSwipeListener;  
  10. import com.daimajia.swipe.SwipeLayout;  
  11. import com.daimajia.swipe.adapters.BaseSwipeAdapter;  
  12.   
  13. /** 
  14.  *  
  15.  * @author zhaokaiqiang 
  16.  *  
  17.  */  
  18. public class ListViewAdapter extends BaseSwipeAdapter {  
  19.   
  20.     // 上下文对象  
  21.     private Context mContext;  
  22.   
  23.     // 构造函数  
  24.     public ListViewAdapter(Context mContext) {  
  25.         this.mContext = mContext;  
  26.     }  
  27.   
  28.     // SwipeLayout的布局id  
  29.     @Override  
  30.     public int getSwipeLayoutResourceId(int position) {  
  31.         return R.id.swipe;  
  32.     }  
  33.   
  34.     @Override  
  35.     public View generateView(int position, ViewGroup parent) {  
  36.         View v = LayoutInflater.from(mContext).inflate(R.layout.listview_item,  
  37.                 parent, false);  
  38.         final SwipeLayout swipeLayout = (SwipeLayout) v  
  39.                 .findViewById(getSwipeLayoutResourceId(position));  
  40.         // 当隐藏的删除menu被打开的时候的回调函数  
  41.         swipeLayout.addSwipeListener(new SimpleSwipeListener() {  
  42.             @Override  
  43.             public void onOpen(SwipeLayout layout) {  
  44.                 Toast.makeText(mContext, "Open", Toast.LENGTH_SHORT).show();  
  45.             }  
  46.         });  
  47.         // 双击的回调函数  
  48.         swipeLayout  
  49.                 .setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {  
  50.                     @Override  
  51.                     public void onDoubleClick(SwipeLayout layout,  
  52.                             boolean surface) {  
  53.                         Toast.makeText(mContext, "DoubleClick",  
  54.                                 Toast.LENGTH_SHORT).show();  
  55.                     }  
  56.                 });  
  57.         // 添加删除布局的点击事件  
  58.         v.findViewById(R.id.ll_menu).setOnClickListener(new OnClickListener() {  
  59.   
  60.             @Override  
  61.             public void onClick(View arg0) {  
  62.                 Toast.makeText(mContext, "delete", Toast.LENGTH_SHORT).show();  
  63.                 //点击完成之后,关闭删除menu  
  64.                 swipeLayout.close();  
  65.             }  
  66.         });  
  67.         return v;  
  68.     }  
  69.   
  70.     //对控件的填值操作独立出来了,我们可以在这个方法里面进行item的数据赋值  
  71.     @Override  
  72.     public void fillValues(int position, View convertView) {  
  73.         TextView t = (TextView) convertView.findViewById(R.id.position);  
  74.         t.setText((position + 1) + "."<p class="p1"><span class="s1"> + </span>"我就是一行很长很长很长很长很长很长很长很长很长很长很长很长很长的测试文本"</p>);  
  75.     }  
  76.   
  77.     @Override  
  78.     public int getCount() {  
  79.         return 20;  
  80.     }  
  81.   
  82.     @Override  
  83.     public Object getItem(int position) {  
  84.         return position;  
  85.     }  
  86.   
  87.     @Override  
  88.     public long getItemId(int position) {  
  89.         return position;  
  90.     }  
  91. }  
    

    如果我们想使用带有滑动布局的listvew,我们需要继承BaseSwipeAdapter,然后对上面代码中提到的重要方法进行实现。

    除了adapter需要改变之外,我们还需要修改listview的item的布局文件。

    下面是listview_item.xml的代码实现。

    

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="80dp" >  
  5.   
  6.     <com.daimajia.swipe.SwipeLayout  
  7.         android:id="@+id/swipe"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent" >  
  10.   
  11.         <LinearLayout  
  12.             android:id="@+id/ll_menu"  
  13.             android:layout_width="100dp"  
  14.             android:layout_height="match_parent"  
  15.             android:background="@android:color/holo_red_light"  
  16.             android:gravity="center" >  
  17.   
  18.             <ImageView  
  19.                 android:id="@+id/trash"  
  20.                 android:layout_width="25dp"  
  21.                 android:layout_height="25dp"  
  22.                 android:src="@drawable/trash" />  
  23.   
  24.             <TextView  
  25.                 android:id="@+id/delete"  
  26.                 android:layout_width="wrap_content"  
  27.                 android:layout_height="wrap_content"  
  28.                 android:text="删除"  
  29.                 android:textColor="#ffffff"  
  30.                 android:textSize="15sp" />  
  31.         </LinearLayout>  
  32.   
  33.         <LinearLayout  
  34.             android:layout_width="match_parent"  
  35.             android:layout_height="match_parent"  
  36.             android:background="@drawable/item_selector"  
  37.             android:padding="6dp" >  
  38.   
  39.             <TextView  
  40.                 android:id="@+id/position"  
  41.                 android:layout_width="wrap_content"  
  42.                 android:layout_height="wrap_content" />  
  43.         </LinearLayout>  
  44.     </com.daimajia.swipe.SwipeLayout>  
  45.   
  46. </LinearLayout>  

    整个item的布局内容需要用SwipeLayout包裹起来,然后添加id,这个id我们需要在adapter里面作为

getSwipeLayoutResourceId()的返回值。

    设置好adapter之后,我们就可以在MainActivity里面为我们的xlistview添加适配器了,下面是一个简单的例子。

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.example.swiperefreshloadlistview;  
  2.   
  3. import me.maxwin.view.XListView;  
  4. import me.maxwin.view.XListView.IXListViewListener;  
  5. import android.app.Activity;  
  6. import android.os.Bundle;  
  7. import android.os.Handler;  
  8. import android.widget.Toast;  
  9.   
  10. /** 
  11.  *  
  12.  * @author zhaokaiqiang 
  13.  *  
  14.  */  
  15. public class MainActivity extends Activity {  
  16.   
  17.     private XListView mListView;  
  18.     // 只是用来模拟异步获取数据  
  19.     private Handler handler;  
  20.   
  21.     @Override  
  22.     protected void onCreate(Bundle savedInstanceState) {  
  23.         super.onCreate(savedInstanceState);  
  24.         setContentView(R.layout.activity_main);  
  25.         handler = new Handler();  
  26.         mListView = (XListView) findViewById(R.id.xListView);  
  27.         // 设置xlistview可以加载、刷新  
  28.         mListView.setPullLoadEnable(true);  
  29.         mListView.setPullRefreshEnable(true);  
  30.         // 设置回调函数  
  31.         mListView.setXListViewListener(new IXListViewListener() {  
  32.   
  33.             @Override  
  34.             public void onRefresh() {  
  35.                 // 模拟刷新数据,1s之后停止刷新  
  36.                 handler.postDelayed(new Runnable() {  
  37.   
  38.                     @Override  
  39.                     public void run() {  
  40.                         mListView.stopRefresh();  
  41.                         Toast.makeText(MainActivity.this"refresh",  
  42.                                 Toast.LENGTH_SHORT).show();  
  43.                     }  
  44.                 }, 1000);  
  45.             }  
  46.   
  47.             @Override  
  48.             public void onLoadMore() {  
  49.                 handler.postDelayed(new Runnable() {  
  50.                     // 模拟加载数据,1s之后停止加载  
  51.                     @Override  
  52.                     public void run() {  
  53.                         mListView.stopLoadMore();  
  54.                         Toast.makeText(MainActivity.this"loadMore",  
  55.                                 Toast.LENGTH_SHORT).show();  
  56.                     }  
  57.                 }, 1000);  
  58.   
  59.             }  
  60.         });  
  61.         // 设置适配器  
  62.         mListView.setAdapter(new ListViewAdapter(this));  
  63.     }  
  64.   
  65. }  

    好了,完成这些之后,我们就实现了刷新、加载、滑动删除功能的多功能lixtview了。

    项目的源代码,请到我的github下载。

    https://github.com/ZhaoKaiQiang/SwipeRefreshLoadListview

8
0 0
原创粉丝点击