您的位置:首页 > 其它

关于数据不满一屏时,下拉刷新和上拉加载同时响应出错解决办法(非正规方式)

2014-11-11 17:53 369 查看
在使用下拉刷新时,我使用的是PullToRefreshListView

使用方式是将开源的java文件拷贝到项目中,使用方法是直接在xml中:

<com.yang.pullrefresh.ui.PullToRefreshListView
android:id="@+id/pull_listview"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<ListView
android:id="@+id/mListView"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="@color/gray"
android:divider="#999999"
android:dividerHeight="1dp" >
</ListView>
</com.yang.pullrefresh.ui.PullToRefreshListView>


其他适配器等的设定跟使用listview一样。

但是问题来了:

数据不满一屏时,出现的情况是当下拉的同时触发上拉加载更多,对于标记最后一条记录的变量,有于是全局变量,造成会在多线程中不安全的被修改,造成数据出错。

解决方式有:将标记设定位局部变量,全局变量是不安全的;判断哪条线程是否有执行,若有另一个在执行,则这个进行wait,避免同时访问那个标示;对变量进行加锁,使它不能被同时访问。

上面的解决办法由于能力有限,没能实现,于是使用了另外的办法:

在源码PullToRefreshBase.java中:

/**
* 开始刷新,当下拉松开后被调用
*/
protected void startRefreshing() {
// 如果正在下拉刷新或正在上拉加载
if (isPullRefreshing() <span style="color:#ff0000;">|| isPullLoading()</span>) {
return;
}

mPullDownState = State.REFRESHING;
onStateChanged(State.REFRESHING, true);

if (null != mHeaderLayout) {
mHeaderLayout.setState(State.REFRESHING);
}

if (null != mRefreshListener) {
// 因为滚动回原始位置的时间是200,我们需要等回滚完后才执行刷新回调
postDelayed(new Runnable() {
@Override
public void run() {
mRefreshListener.onPullDownToRefresh(PullToRefreshBase.this);
}
}, getSmoothScrollDuration());
}
}

/**
* 开始加载更多,上拉松开后调用
*/
protected void startLoading() {
// 如果正在上拉加载或正在下拉刷新
if (isPullLoading() <span style="color:#ff0000;">|| isPullRefreshing()</span>) {
return;
}

mPullUpState = State.REFRESHING;
onStateChanged(State.REFRESHING, false);

if (null != mFooterLayout) {
mFooterLayout.setState(State.REFRESHING);
}

if (null != mRefreshListener) {
// 因为滚动回原始位置的时间是200,我们需要等回滚完后才执行加载回调
postDelayed(new Runnable() {
@Override
public void run() {
mRefreshListener.onPullUpToRefresh(PullToRefreshBase.this);
}
}, getSmoothScrollDuration());
}
}
红色部分是让两个操作只能执行一个,避免同时进行。

方法很笨,没有技术含量,希望大家给出好的解决办法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: