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

在使用下拉刷新时,我使用的是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());
		}
	}
红色部分是让两个操作只能执行一个,避免同时进行。

方法很笨,没有技术含量,希望大家给出好的解决办法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值