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

转载请说明出处:http://blog.csdn.net/bz419927089

如果想做带有刷新、加载更多功能的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的代码实现。

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.TextView;
import android.widget.Toast;

import com.daimajia.swipe.SimpleSwipeListener;
import com.daimajia.swipe.SwipeLayout;
import com.daimajia.swipe.adapters.BaseSwipeAdapter;

/**
 *
 * @author zhaokaiqiang
 *
 */
public class ListViewAdapter extends BaseSwipeAdapter {

	// 上下文对象
	private Context mContext;

	// 构造函数
	public ListViewAdapter(Context mContext) {
		this.mContext = mContext;
	}

	// SwipeLayout的布局id
	@Override
	public int getSwipeLayoutResourceId(int position) {
		return R.id.swipe;
	}

	@Override
	public View generateView(int position, ViewGroup parent) {
		View v = LayoutInflater.from(mContext).inflate(R.layout.listview_item,
				parent, false);
		final SwipeLayout swipeLayout = (SwipeLayout) v
				.findViewById(getSwipeLayoutResourceId(position));
		// 当隐藏的删除menu被打开的时候的回调函数
		swipeLayout.addSwipeListener(new SimpleSwipeListener() {
			@Override
			public void onOpen(SwipeLayout layout) {
				Toast.makeText(mContext, "Open", Toast.LENGTH_SHORT).show();
			}
		});
		// 双击的回调函数
		swipeLayout
				.setOnDoubleClickListener(new SwipeLayout.DoubleClickListener() {
					@Override
					public void onDoubleClick(SwipeLayout layout,
							boolean surface) {
						Toast.makeText(mContext, "DoubleClick",
								Toast.LENGTH_SHORT).show();
					}
				});
		// 添加删除布局的点击事件
		v.findViewById(R.id.ll_menu).setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View arg0) {
				Toast.makeText(mContext, "delete", Toast.LENGTH_SHORT).show();
				//点击完成之后,关闭删除menu
				swipeLayout.close();
			}
		});
		return v;
	}

	//对控件的填值操作独立出来了,我们可以在这个方法里面进行item的数据赋值
	@Override
	public void fillValues(int position, View convertView) {
		TextView t = (TextView) convertView.findViewById(R.id.position);
		t.setText((position + 1) + "."<p class="p1"><span class="s1"> + </span>"我就是一行很长很长很长很长很长很长很长很长很长很长很长很长很长的测试文本"</p>);
	}

	@Override
	public int getCount() {
		return 20;
	}

	@Override
	public Object getItem(int position) {
		return position;
	}

	@Override
	public long getItemId(int position) {
		return position;
	}
}

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

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

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

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="80dp" >

    <com.daimajia.swipe.SwipeLayout
        android:id="@+id/swipe"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >

        <LinearLayout
            android:id="@+id/ll_menu"
            android:layout_width="100dp"
            android:layout_height="match_parent"
            android:background="@android:color/holo_red_light"
            android:gravity="center" >

            <ImageView
                android:id="@+id/trash"
                android:layout_width="25dp"
                android:layout_height="25dp"
                android:src="@drawable/trash" />

            <TextView
                android:id="@+id/delete"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="删除"
                android:textColor="#ffffff"
                android:textSize="15sp" />
        </LinearLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:background="@drawable/item_selector"
            android:padding="6dp" >

            <TextView
                android:id="@+id/position"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />
        </LinearLayout>
    </com.daimajia.swipe.SwipeLayout>

</LinearLayout>

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

getSwipeLayoutResourceId()的返回值。

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

package com.example.swiperefreshloadlistview;

import me.maxwin.view.XListView;
import me.maxwin.view.XListView.IXListViewListener;
import android.app.Activity;
import android.os.Bundle;
import android.os.Handler;
import android.widget.Toast;

/**
 *
 * @author zhaokaiqiang
 *
 */
public class MainActivity extends Activity {

	private XListView mListView;
	// 只是用来模拟异步获取数据
	private Handler handler;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		handler = new Handler();
		mListView = (XListView) findViewById(R.id.xListView);
		// 设置xlistview可以加载、刷新
		mListView.setPullLoadEnable(true);
		mListView.setPullRefreshEnable(true);
		// 设置回调函数
		mListView.setXListViewListener(new IXListViewListener() {

			@Override
			public void onRefresh() {
				// 模拟刷新数据,1s之后停止刷新
				handler.postDelayed(new Runnable() {

					@Override
					public void run() {
						mListView.stopRefresh();
						Toast.makeText(MainActivity.this, "refresh",
								Toast.LENGTH_SHORT).show();
					}
				}, 1000);
			}

			@Override
			public void onLoadMore() {
				handler.postDelayed(new Runnable() {
					// 模拟加载数据,1s之后停止加载
					@Override
					public void run() {
						mListView.stopLoadMore();
						Toast.makeText(MainActivity.this, "loadMore",
								Toast.LENGTH_SHORT).show();
					}
				}, 1000);

			}
		});
		// 设置适配器
		mListView.setAdapter(new ListViewAdapter(this));
	}

}

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

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

https://github.com/ZhaoKaiQiang/SwipeRefreshLoadListview

时间: 2024-10-10 17:54:35

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

Android Demo 下拉刷新+加载更多+滑动删除

小伙伴们在逛淘宝或者是各种app上,都可以看到这样的功能,下拉刷新和加载更多以及滑动删除,刷新,指刷洗之后使之变新,比喻突破旧的而创造出新的,比如在手机上浏览新闻的时候,使用下拉刷新的功能,我们可以第一时间掌握最新消息,加载更多是什么nie,简单来说就是在网页上逛淘宝的时候,我们可以点击下一页来满足我们更多的需求,但是在手机端就不一样了,没有上下页,怎么办nie,方法总比困难多,细心的小伙伴可能会发现,在手机端中,有加载更多来满足我们的要求,其实加载更多也是分页的一种体现.小伙伴在使用手机版QQ

Android UI--自定义ListView(实现下拉刷新+加载更多)

http://blog.csdn.net/wwj_748/article/details/12512885 Android UI--自定义ListView(实现下拉刷新+加载更多) 关于实现ListView下拉刷新和加载更多的实现,我想网上一搜就一堆.不过我就没发现比较实用的,要不就是实现起来太复杂,要不就是不健全的.因为小巫近期要开发新浪微博客户端,需要实现ListView的下拉刷新,所以就想把这个UI整合到项目当中去,这里只是一个demo,可以根据项目的需要进行修改. 就不要太在乎界面了哈:

iOS:详解MJRefresh刷新加载更多数据的第三方库

原文链接:http://www.ios122.com/2015/08/mjrefresh/ 简介 MJRefresh这个第三方库是李明杰老师的杰作,这个框架帮助我们程序员减轻了超级多的麻烦,节约了开发时间,提高了开发效率.由于目前能力有限,尚不能自己写一套框架,所以就先膜拜和看明白大牛的框架了. 用于为应用添加常用的上拉加载更多与下拉刷新效果,适用 UIScrollView . UITableView . UICollectionView . UIWebView. gtihub上的地址:http

Android_ListView上拉加载更多(ListView分页功能)

先上效果图 加载完数据 首先定义一个底部正在加载的布局footer_layout.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layou

【Android界面实现】ZListView,一个最强大的刷新、加载、滑动删除的ListView控件(二)

转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 我们接着上篇的文章说,在前一篇文章中,我们学习了ZListView的使用,这一篇就开始说一些干货了,本篇文章将介绍ZListView的实现原理. 其实说是ZListView的实现原理,不如说是ZSwipeItem的实现原理,因为ZSwipeItem才是滑动的关键所在. ZSwipeItem的滑动,主要是通过ViewDragHelper这个类实现的.在接触这个项目之前,我没听过,也从来碰到过这个类,View

ajax实现下拉菜单无刷新加载更多

1 $(function() { 2 var page = 1; 3 var discount = $('#discount'); 4 var innerHeight = window.innerHeight; 5 var timer2 = null; 6 $.ajax({ 7 url: '/lightapp/marketing/verify/apply/list?page=1', 8 type: 'GET', 9 dataType: 'json', 10 timeout: '1000', 11

android 下拉刷新/上拉加载更多【pull-to-refresh】

这两天在做一个功能,需要用到"下拉刷新和上拉加载更多"这样的功能,开始的时候以为都是自己用控件加以控件来完成的,后来,在网上找了好长时间,发现直接可以用别人的现在的 library . 引用别人的library后直接就可以用的,只是注意一些细节就可以了. 我用的是pull to refresh (很多人都说这个比较好点). 它支持多种常用的需要刷新的View类型,如:ListView.ExpandableListView.GridView.WebView等.这里就给个下载地址吧:htt

android 下拉刷新上拉加载更多,高仿ios左滑动删除item,解决了众多手势问题

一.前言 老规矩,别的不说,这demo是找了很相关知识集合而成的,可以说对我这种小白来说是绞尽脑汁!程序员讲的是无图无真相!现在大家一睹为快! 二.比较关键的还是scroller这个类的 package com.icq.slideview.view; import android.content.Context; import android.util.AttributeSet; import android.util.Log; import android.util.TypedValue; i

10.下拉刷新、加载更多、标记已读、轮播条、缓存

下拉刷新.加载更多.标记已读.轮播条.缓存 下拉刷新------- 1.addHeaderView必须在setAdapter之前调用 2.将paddingTop设置一个headerView高度的负值去隐藏它 getHeight()和getMeasuredHeight()的区别: getMeasuredHeight():获取测量完的高度,只要在onMeasure方法执行完,就可以用 它获取到宽高,在自定义控件内部多使用这个 使用view.measure(0,0)方法可以主动通知系统去测量,然后就