Git Product home page Git Product logo

mvchelper's Introduction

[TOC]

MVCHelper主要用于下拉刷新加载,失败,加载,空数据,成功的界面切换。

MVCHelper +(IDataSource或ITask)+ IDataAdapter + 下拉刷新控件 + 布局切换(ILoadViewFactory,ILoadView,ILoadMoreView)

原先Task的代码已经抽离出单独一个类库:https://github.com/LuckyJayce/Task

历史版本和更新信息

https://github.com/LuckyJayce/MVCHelper/releases

常见疑惑集锦

Info.md

Gradle导入

1.必须导入:

//MVCHelper核心类库
compile 'com.shizhefei:MVCHelper-Library:1.4.0'
//里面有使用recyclerview,所以需要导入recyclerview,版本不限
compile 'com.android.support:recyclerview-v7:28.0.0'

2.可选:

<1> 使用 https://github.com/LuckyJayce/CoolRefreshView 的刷新控件导入 支持任意View的刷新 ,支持自定义Header,支持NestedScrollingParent,NestedScrollingChild的事件分发,嵌套ViewPager不会有事件冲突

//里面包含一个MVCCoolHelper 是适配这个控件的 MVCHelper
compile 'com.shizhefei:MVCHelper-CoolRefresh:1.4.0'
compile 'com.shizhefei:CoolRefreshView:1.0.1'
//v4版本不限
compile 'com.android.support:support-v4:28.0.0'

<2> 使用 https://github.com/chrisbanes/Android-PullToRefresh 的刷新控件导入

//里面包含一个MVCPullrefshHelper 是适配这个控件的 MVCHelper
compile 'com.shizhefei:MVCHelper-Pullrefresh:1.4.0'
//由于没有找到gradle排至,我自己把它上传到jcenter上
compile 'com.shizhefei:pulltorefresh:1.0.1'

<3> 使用 https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh 的刷新控件导入

//里面包含一个MVCUltraHelper 是适配这个控件的 MVCHelper
compile 'com.shizhefei:MVCHelper-UltraRefresh:1.4.0'
//这里6月29号目前最新的,要实时关注新版本去秋大的网站上去看
compile 'in.srain.cube:ultra-ptr:1.0.11'

<4> 使用android v4的SwipeRefreshLayout的作为刷新控件导入

//里面包含一个MVCSwipeRefreshHelper 是适配这个控件的 MVCHelper
compile 'com.shizhefei:MVCHelper-SwipeRefresh:1.4.0'
//v4包应该都有导入吧,v7包里面包含v4包, v4版本不限
compile 'com.android.support:support-v4:28.0.0'

<5> 测试用例,可以方便的查看MVCHelper,Task的运行情况和返回数据,还提供了修改接口字段,用于接口测试很方便哦

//MVCHelper的测试用例,继承ABSTestCaseFragment实现List<TestCaseData> getTestCaseDatas()方法
compile 'com.shizhefei:task-testcese:1.0.0'
//里面用到了gson
compile 'com.google.code.gson:gson:2.2.4'

结构

image
这里V和M是没有联系的,或许可以理解为是MVP结构吧.

类图:

https://raw.githubusercontent.com/LuckyJayce/MVCHelper/master/raw/MVCHelper%E7%B1%BB%E5%9B%BE.png

效果图:

image

一、 MVCHelper

MVCHelper. 实现下拉刷新,滚动底部自动加载更多,分页加载,自动切换显示网络失败布局,暂无数据布局,,真正的MVC架构.

1.Model (IDataSource)数据源,加载数据

同步请求实现IDataSource,异步请求(okhttp,volley,rxjava+retrofit)实现IAsyncDataSource

<1>同步请求(直接返回结果
​ //数据源 ​ ​ public interface IDataSource { ​ // 获取刷新的数据 ​ public DATA refresh() throws Exception; ​
// 获取加载更多的数据 public DATA loadMore() throws Exception;

	// 是否还可以继续加载更多
	public boolean hasMore();
}

例如:分页加载书籍列表数据 ​
​ public class BooksDataSource implements IDataSource<List> { ​ private int page = 1; ​ private int maxPage = 5; ​ ​ @Override ​ public List refresh() throws Exception { ​ return loadBooks(1); ​ } ​ @Override public List loadMore() throws Exception { return loadBooks(page + 1); }

	private List<Book> loadBooks(int page) {
		List<Book> books = new ArrayList<Book>();
		for (int i = 0; i < 20; i++) {
			books.add(new Book("page" + page + "  Java编程** " + i, 108.00d));
		}
		this.page = page;
		return books;
	}

	@Override
	public boolean hasMore() {
		return page < maxPage;
	}

}

<2>异步请求(就是请求等待回调函数返回结果

 /**
 * 异步数据源(比如Volley,OkHttp等异步请求使用)
 * @param <DATA>
 */
public interface IAsyncDataSource<DATA> {
    /**
     * 获取刷新的数据
     *
     * @param sender 用于请求结束时发送数据给MVCHelper,MVCHelper再通知IDataAdapter调用notifyDataChenge方法
     * @return 用于提供外部取消请求的处理.比如执行refresh还没请求结束又执行refresh,就会通过上次的RequestHandle取消上次的请求.MVCHelper的destroy也会用这个取消请求
     * @throws Exception
     */
    RequestHandle refresh(ResponseSender<DATA> sender) throws Exception;

    /**
     * 获取加载更多的数据
     *
     * @param sender 用于请求结束时发送数据给MVCHelper,MVCHelper再通知IDataAdapter调用notifyDataChenge方法
     * @return 用于提供外部取消请求的处理.比如执行refresh还没请求结束又执行refresh,就会通过上次的RequestHandle取消上次的请求.MVCHelper的destroy也会用这个取消请求
     * @throws Exception
     */
    RequestHandle loadMore(ResponseSender<DATA> sender) throws Exception;

    /**
     * 是否还可以继续加载更多
     *
     * @return
     */
    boolean hasMore();

}

例如:OkHttp请求

public class BooksOkHttpNormal_DataSource implements IAsyncDataSource<List<Book>> {
    private int mPage;
    private int mMaxPage = 5;

    public BooksOkHttpNormal_DataSource() {
        super();
    }

    @Override
    public RequestHandle refresh(ResponseSender<List<Book>> sender) throws Exception {
        return loadBooks(sender, 1);
    }

    @Override
    public RequestHandle loadMore(ResponseSender<List<Book>> sender) throws Exception {
        return loadBooks(sender, mPage + 1);
    }

    @Override
    public boolean hasMore() {
        return mPage < mMaxPage;
    }

    private RequestHandle loadBooks(final ResponseSender<List<Book>> sender, final int page) throws Exception {
        Request request = new Request.Builder().url("https://www.baidu.com").get().build();
        Call call = OkHttpUtils.client.newCall(request);
        call.enqueue(new Callback() {

            @Override
            public void onFailure(Call call, IOException e) {
                //send 要放在最后一句(请求结束)
                sender.sendError(e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {
                final List<Book> books = new ArrayList<Book>();
                for (int i = 0; i < 15; i++) {
                    books.add(new Book("page" + page + "  Java编程** " + i, 108.00d));
                }
                mPage = page;

                //send 要放在最后一句(请求结束)
                sender.sendData(books);
            }
        });
        return new OKHttpRequestHandle(call);
    }
}

public class OKHttpRequestHandle implements RequestHandle {

    private final Call call;

    public OKHttpRequestHandle(Call call) {
        super();
        this.call = call;
    }

    @Override
    public void cancle() {
        call.cancel();
    }

    @Override
    public boolean isRunning() {
        return false;
    }
}

例如:使用 MVCHelper-OkHttp

public class BooksOkHttp_AsyncDataSource implements IAsyncDataSource<List<Book>> {
    private int mPage;
    private int mMaxPage = 5;

    @Override
    public RequestHandle refresh(ResponseSender<List<Book>> sender) throws Exception {
        return loadBooks(sender, 1);
    }

    @Override
    public RequestHandle loadMore(ResponseSender<List<Book>> sender) throws Exception {
        return loadBooks(sender, mPage + 1);
    }

    @Override
    public boolean hasMore() {
        return mPage < mMaxPage;
    }

    private RequestHandle loadBooks(final ResponseSender<List<Book>> sender, final int page) throws Exception {
        GetMethod method = new GetMethod("https://www.baidu.com");
        method.addHeader("a", "aaaaa");
        method.addParam("api_key", "75ee6c644cad38dc8e53d3598c8e6b6c");
        //method 里面已经封装了sender.sendData 和 sendError的方法,只要关心ResponseParser解析Response返回数据就好
        method.executeAsync(sender, new ResponseParser<List<Book>>() {
            @Override
            public List<Book> parse(Response response) throws Exception {
                List<Book> books = new ArrayList<Book>();
                for (int i = 0; i < 15; i++) {
                    books.add(new Book("page" + page + "  Java编程** " + i, 108.00d));
                }
                mPage = page;
                return books;
            }
        });
        return method;
    }
}

**详细写法请看 https://github.com/LuckyJayce/MVCHelper/tree/master/app/src/main/java/com/shizhefei/test/models/datasource
里面有

2.View(IDataAdapter) 视图,显示数据

这里不是指Android的view,而是显示数据的概念和显示逻辑


​ public interface IDataAdapter { ​ ​ public abstract void notifyDataChanged(DATA data, boolean isRefresh); ​ public abstract DATA getData();

	public boolean isEmpty();

}

例如:分页显示书籍列表数据 ​ ​ public class BooksAdapter extends BaseAdapter implements IDataAdapter<List> { ​ private List books = new ArrayList(); ​ private LayoutInflater inflater; ​ ​ public BooksAdapter(Context context) { ​ super(); ​ inflater = LayoutInflater.from(context); ​ } ​ @Override public View getView(int position, View convertView, ViewGroup parent) { if (convertView == null) { convertView = inflater.inflate(R.layout.item_book, parent, false); } TextView textView = (TextView) convertView; textView.setText(books.get(position).getName()); return convertView; }

	@Override
	public void notifyDataChanged(List<Book> data, boolean isRefresh) {
		if (isRefresh) {
			books.clear();
		}
		books.addAll(data);
		notifyDataSetChanged();
	}

	@Override
	public int getCount() {
		return books.size();
	}

	@Override
	public List<Book> getData() {
		return books;
	}


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

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

​ ​ }

3.Controller (Activity,Fragment,MVCHelper)控制器

控制器负责调用读取数据,调用显示数据,处理用户交互

Activity负责调度,代码如下 ​ ​ public class MainActivity extends Activity { ​ ​ private MVCHelper<List> mvcHelper; ​ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 设置LoadView的factory,用于创建用户自定义的加载失败,加载中,加载更多等布局 // MVCHelper.setLoadViewFractory(new LoadViewFractory());

		PullToRefreshListView refreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView);
		mvcHelper = new MVCPullrefshHelper<List<Book>>(refreshListView);

		// 设置数据源
		mvcHelper.setDataSource(new BooksDataSource());
		// 设置适配器
		mvcHelper.setAdapter(new BooksAdapter(this));

		// 加载数据
		mvcHelper.refresh();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 释放资源
		mvcHelper.destory();
	}
}

只要写了上述几行代码,恭喜你,你已经实现了分页加载显示书籍列表,实现下拉刷新,滚动底部自动加载更多,在网络请求失败的时候自动显示网络失败,没有数据时显示无数据布局,加载成功时显示书籍列表

4.ILoadViewFractory 自定义 失败布局,无数据布局,加载中布局

实现ILoadViewFractory
MVCHelper.setLoadViewFractory(new LoadViewFractory());
就这样,就会显示你自定义的布局

5.你可以自由的切换刷新类库

1.用CoolRefreshView 作为刷新框架(MVCCoolHelper)
地址:https://github.com/LuckyJayce/CoolRefreshView

	CoolRefreshView coolRefreshView = (CoolRefreshView) findViewById(R.id.coolRefreshView);
	MVCHelper<List<Book>> mvcHelper = new MVCCoolHelper<List<Book>>(coolRefreshView);

	// 设置数据源
	mvcHelper.setDataSource(new BooksDataSource());
	// 设置适配器
	mvcHelper.setAdapter(new BooksAdapter(this));

	// 加载数据
	mvcHelper.refresh();

2.用android-support-v4.jar 的SwipeRefreshLayout作为刷新框架(MVCSwipeRefreshHelper)

	SwipeRefreshLayout swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefreshLayout);
	MVCHelper<List<Book>> mvcHelper = new MVCSwipeRefreshHelper<List<Book>>(swipeRefreshLayout);

	// 设置数据源
	mvcHelper.setDataSource(new BooksDataSource());
	// 设置适配器
	mvcHelper.setAdapter(new BooksAdapter(this));

	// 加载数据
	mvcHelper.refresh();

3.用Android-PullToRefresh-Library作为刷新框架**(MVCPullrefshHelper)**
地址:https://github.com/chrisbanes/Android-PullToRefresh

	PullToRefreshListView refreshListView = (PullToRefreshListView) findViewById(R.id.pullToRefreshListView);
	MVCHelper<List<Book>> mvcHelper = new MVCPullrefshHelper<List<Book>>(refreshListView);

	// 设置数据源
	mvcHelper.setDataSource(new BooksDataSource());
	// 设置适配器
	mvcHelper.setAdapter(new BooksAdapter(this));

	// 加载数据
	mvcHelper.refresh();

4.用android-Ultra-Pull-To-Refresh-library作为刷新框架**(MVCUltraHelper)**
地址:https://github.com/liaohuqiu/android-Ultra-Pull-To-Refresh

	PtrClassicFrameLayout mPtrFrameLayout = (PtrClassicFrameLayout) findViewById(R.id.rotate_header_list_view_frame);

	MVCHelper<List<Book>> mvcHelper = new MVCUltraHelper<List<Book>>(mPtrFrameLayout);
	// 设置数据源
	mvcHelper.setDataSource(new BooksDataSource());
	// 设置适配器
	mvcHelper.setAdapter(new BooksAdapter(this));

	// 加载数据
	mvcHelper.refresh();

5.不使用刷新框架(MVCNormalHelper

	View contentLayout = findViewById(R.id.content_layout);
	MVCHelper<Book> mvcHelper= new MVCNormalHelper<Book>(contentLayout);

	// 设置数据源
	mvcHelper.setDataSource(new BookDetailDataSource());
	// 设置适配器
	mvcHelper.setAdapter(dataAdapter);

	// 加载数据
	mvcHelper.refresh();

6.如果使用其他刷新框架的话可以继承MVCHelper自定义一个

6.任何View的MVC

可以任意的View作为刷新的内容,并且提供相同的MVC架构操作
​ ​ /*** ​ * 测试下拉组件的非列表界面 ​ * ​ * @author LuckyJayce ​ * ​ */ ​ public class BooDetailActivity extends Activity { ​ ​ private MVCHelper listViewHelper; ​ private TextView authorTextView; ​ private TextView contentTextView; ​ private TextView descriptionTextView; ​ private TextView nameTextView; ​

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_bookdetail);

		nameTextView = (TextView) findViewById(R.id.name_textView);
		authorTextView = (TextView) findViewById(R.id.author_textView);
		descriptionTextView = (TextView) findViewById(R.id.description_textView);
		contentTextView = (TextView) findViewById(R.id.content_textView);

		PtrClassicFrameLayout contentLayout = (PtrClassicFrameLayout) findViewById(R.id.rotate_header_list_view_frame);
		listViewHelper = new MVCUltraHelper<Book>(contentLayout);

		// 设置数据源
		listViewHelper.setDataSource(new BookDetailDataSource());
		// 设置适配器
		listViewHelper.setAdapter(dataAdapter);

		// 加载数据
		listViewHelper.refresh();
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		// 释放资源
		listViewHelper.destory();
	}

	private IDataAdapter<Book> dataAdapter = new IDataAdapter<Book>() {
		private Book data;

		@Override
		public void notifyDataChanged(Book data, boolean isRefresh) {
			this.data = data;
			authorTextView.setText(data.getAuthor());
			contentTextView.setText(data.getContent());
			descriptionTextView.setText(data.getDescription());
			nameTextView.setText(data.getName());
		}

		@Override
		public boolean isEmpty() {
			return data == null;
		}

		@Override
		public Book getData() {
			return data;
		}
	};

	public void onClickBack(View view) {
		finish();
	}

}

7.不再局限于返回值的个数

原先

public class MovieDetailDataSource implements IDataSource<Movie>{

}

使用Data1的可以传一个泛型返回值
使用Data2的可以传两个泛型返回值
使用Data3的可以传三个泛型参数

public class MovieDetailDataSource implements IDataSource<Data3<Movie, List<Discuss>, List<Movie>>>{

}

注意:

    1.权限:  
        android.permission.INTERNET  
        android.permission.ACCESS_NETWORK_STATE  
    2.如果不是网络请求数据,比如从数据库获取数据设置 mvcHelper.setNeedCheckNetwork(false);  

三、说明

** 以下是目前支持的下拉刷新的开源类库 **
CoolRefreshView
Android-PullToRefresh-Library
android-Ultra-Pull-To-Refresh-library
android-support-v4.jar

**以下是对应刷新类库的MVCHelper **
MVCCoolHelper
MVCPullrefshHelper
MVCUltraHelper
MVCSwipeRefreshHelper

核心代码
MVCHelper_Library

示例代码
MVCHelper_Demo

主力类库

1.https://github.com/LuckyJayce/ViewPagerIndicator
Indicator 取代 tabhost,实现网易顶部tab,新浪微博主页底部tab,引导页,无限轮播banner等效果,高度自定义tab和特效

2.https://github.com/LuckyJayce/MVCHelper
实现下拉刷新,滚动底部自动加载更多,分页加载,自动切换显示网络失败布局,暂无数据布局,支持任意view,支持切换主流下拉刷新框架。

3.https://github.com/LuckyJayce/MultiTypeView
简化RecyclerView的多种type的adapter,Fragment可以动态添加到RecyclerView上,实现复杂的界面分多个模块开发

4.https://github.com/LuckyJayce/EventBus-Apt
事件总线,通过动态代理接口的形式发布,接收事件。定义一个接口把事件发给注册并实现接口的类

5.https://github.com/LuckyJayce/LargeImage
大图加载,可供学习

6.https://github.com/LuckyJayce/GuideHelper
新手引导页,轻松的实现对应的view上面的显示提示信息和展示功能给用户

7.https://github.com/LuckyJayce/HVScrollView
可以双向滚动的ScrollView,支持嵌套ScrollView联级滑动,支持设置支持的滚动方向

8.https://github.com/LuckyJayce/CoolRefreshView
下拉刷新RefreshView,支持任意View的刷新 ,支持自定义Header,支持NestedScrollingParent,NestedScrollingChild的事件分发,嵌套ViewPager不会有事件冲突

License

Copyright 2015 shizhefei(LuckyJayce)

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

mvchelper's People

Contributors

luckyjayce avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mvchelper's Issues

onScrollListener 无响应

无法对listView的滑动做监听,因为滑动事件已经被用来判断是否滑到底部了。请问有什么方法解决吗?谢谢

SwipeRefreshLayout + RecyclerView, item点击事件异常

项目环境:SwipeRefreshLayout + RecyclerView + CommonAdapter
bug描述:使用了Mvchelper的recyclerview中有一个item,item中有一个button,此时分别为item root布局和button添加点击时间,root点击11:56:49不会触发。如果不适用Mvchlper则root时间触发。

挺好的一个库,只是摸索起来有点难。

这个库是好东西,建议写一个好的教程,摸索起来有点难。
还有就是直接编译出来的那个库还不能用,找不到资源(不想依赖你源码的工程)。还得自己写ILoadViewFactory 子类。。最好在教程说一下这个。。

cache

如何将loadCache不放在UI线程,以及怎样判断如果有cache就不访问网络

一个小问题

如果分页的数据是网络请求回来的,比如用第三方库asyncclient,在它的handler中解析的(json解析成vo),这个时候和这个库就不兼容了。就是说,首先,进行网络请求的时候是另起一个线程请求的,所以结果不可能立即返回或者说不确定是否能返回,如果用作者的异步获取分页数据的方法,和网络请求这个线程不是一个线程,还是不兼容。抱歉,我语文是体育老师教的,不知道是不是描述清楚了。。。

一个小问题!

CoolRefreshView嵌套NestedScrollView在嵌套RecyclerView就不能加载更多了吗?以下是布局代码:
<com.shizhefei.view.coolrefreshview.CoolRefreshView
android:id="@+id/home_seeMore_refresh_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:descendantFocusability="blocksDescendants">
<android.support.v4.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:scrollbars="none"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
>
<android.support.v7.widget.RecyclerView
android:id="@+id/home_seeMore_recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:nestedScrollingEnabled="false"/>
</android.support.v4.widget.NestedScrollView>
</com.shizhefei.view.coolrefreshview.CoolRefreshView>

mvchelper及taskhelper

在一个页面中用到了mvchelper及taskhelper,那么mvchelper在下拉刷新的时候,要怎样去触发taskhelper的刷新操作呢?还是说taskhelper也只实现IAsyncDataSource就可以了达到目的了?

发现一个小bug

首先感谢作者的辛苦和优秀的架构。
在使用过程中发现一个小问题。利用MVCHelper实现下拉刷新的时候,处理下拉的这个触摸事件不是根据手指触摸的x轴距离和y轴距离来处理的(即:手指触摸x轴移动的距离>y轴移动的距离,不执行下拉。x轴移动的距离<y轴移动的距离,那么就执行下拉。)。而您的项目里,是只要在y轴方向有触摸距离,则整体页面下拉。
那么这样导致的问题是,如果当前页面有轮播图,我在轮播图上滑动,滑动的时候,只要在y轴方向上有触摸移动距离,那么事件会被外层的下拉拦截。导致轮播图和外层下拉刷新事件冲突。体验不是很好。
烦请楼主检验一下是否有这样的问题!多谢!

初次进入页面只显示“点击加载更多”,用的SwipeRefreshLayout

要碰一下屏幕才能出现数据

目前只在4.4及其以下的设备上发现这种情况,初步判断是加入了以下Fragment的onBackPressed:

    if ((view = getView()) != null) {
        view.setFocusableInTouchMode(true);
        view.requestFocus();
        view.setOnKeyListener(new View.OnKeyListener() {
            @Override
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_BACK) {
                    onBackPressed();
                    return true;
                }
                return false;
            }
        });
    }

错误提示

数据失败的提示语不能根据请求返回的code更改,所有的失败都是“网络加载失败”

fragment下面ListView调用notifyDataSetChanged页面没刷新

DataSource加上阻塞之后,获取数据,然后notifyDataSetChanged刷新,界面没有变化,需要手动点一下屏幕才会刷新界面

DataSource获取数据加了这个
Thread.sleep(1000);

其他都是按照demo写的

华为mt7手机 android4.4

求救

关于加载失败、加载中界面的展现。

首先感谢作者!
有个小问题,如果我想在某个界面,只是单纯想实现下拉刷新,而不需要加载中、加载失败、加载成功这些界面,需要如何实现呢?

关于Datasources的一个小问题

文件MVCHelper/mvchelper_tasks/src/main/java/com/shizhefei/task/datasource/Datasources.java里定义了公共类DataSources,但文件名中却是小写的s与类名不一致,会报错:
Error:(11, 8) 错误: 类DataSources是公共的, 应在名为 DataSources.java 的文件中声明

发现一个bug

连续下拉刷新时候(往往第三次),没有刷新效果

用android-Ultra-Pull-To-Refresh-library做刷新框架,出现的问题

用android-Ultra-Pull-To-Refresh-library做刷新框架,比照demo来做,代码都是拷贝过来的,运行的时候可以下拉刷新,也可以按照分页加载更多,但是就是不显示listview,head下面紧跟着“点击加载更多”,没有listview,不知道哪里出问题了

结合vlayout使用

你好,请问在结合vlayout使用,在加载更多的时候,底部那个加载更多提示 就只能是自己再去实现了?

关于ILoadViewFractory 自定义 失败布局,无数据布局,加载中布局

首先感谢作者。
关于ILoadViewFractory 自定义 失败布局,无数据布局,加载中布局,
目前看来只能全局自定义各一种,
想请问下如果要根据不同的activity/fragment 动态使用不同的失败布局,无数据布局,加载中布局
该如何去implements ILoadViewFactory这个接口

你该更新jar包了,坑爹啊 0.0

使用jar包的话,SwipeRefreshLayout 结合 recyclerview会出现问题,‘点击加载更多’即loadmoreview会占据一整页屏幕添加到reyclerview底部。但是使用依赖工程MVCHelper_Library就不会出现问题。我eclipse用依赖工程运行没问题,studio运行jar包就出现问题,一模一样的代码,害得我蛋疼了几天,刚才发现可能是jar包跟MVCHelper_Library版本不一样,于是把eclipse工程也换成jar包,果然就出现了同样的问题...

这个非常好用,但有个问题

第一个问题,是你的群的入口问题,确实不知道怎么回事,嗯,java是新手
第二个问题,是想进群问的问题。。。
mvcHelper.getDataSource()得到的是同步datasource,异步的没有?反正我这是得到null

请问怎么和android-async-http配合使用

我使用android-async-http来处理网络请求,但android-async-http使用的都是回调的方式返回结果,
例如:

class TwitterRestClientUsage {
public void getPublicTimeline() throws JSONException {
TwitterRestClient.get("statuses/public_timeline.json", null, new JsonHttpResponseHandler() {
@OverRide
public void onSuccess(int statusCode, Header[] headers, JSONObject response) {
// If the response is JSONObject instead of expected JSONArray
}

        @Override
        public void onSuccess(int statusCode, Header[] headers, JSONArray timeline) {
            // Pull out the first event on the public timeline
            JSONObject firstEvent = timeline.get(0);
            String tweetText = firstEvent.getString("text");

            // Do something with the response
            System.out.println(tweetText);
        }
    });
}

}

而您提供的数据访问接口里是同步请求,请问我怎么才能把android-async-http的访问封装进去,谢谢。

private List<Book> loadBooks(int page) throws Exception {
    // 这里用百度首页模拟网络请求,如果网路出错的话,直接抛异常不会执行后面的获取books的语句
    HttpUtils.executeGet("http://www.baidu.com");
    Thread.sleep(300);

    List<Book> books = new ArrayList<Book>();
    for (int i = 0; i < 20; i++) {
        books.add(new Book("page" + page + "  Java编程** " + i, 108.00d));
    }
    this.page = page;
    return books;
}

listview显示数据问题

viewpager嵌套的fragment中使用listview加载数据,有时候只显示一个footer《已经加载完毕》或《点击加载更多》,手动刷新一下数据才能显示,不知道为什么,请教作者,用的SwipeRefreshLayout内嵌listview

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.