android开发怎么刷新 scrollview
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android开发怎么刷新 scrollview相关的知识,希望对你有一定的参考价值。
代码很简单,但是很实用,适合在一个Activity中要刷新局部的UI,比如在扫描一维码的时候,要把每次扫描的结果都显示在界面上
创建一个包含ScrollView的布局文件:
2.实现ScrollView的刷新
代码如下:package com.example.uirefresh;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.ScrollView;
import android.widget.TextView;
public class MainActivity extends Activity implements android.view.View.OnClickListener
private Button btnExit;
private TextView text;
private ScrollView scroll;
private boolean bool = true;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btnExit = (Button) findViewById(R.id.exit);
text = (TextView) findViewById(R.id.text);
scroll = (ScrollView) findViewById(R.id.scroll);
btnExit.setOnClickListener(this);
//在主线程main中开一子线程来刷新局部的ScrollView
new Thread(new RefreshThread()).start();
@Override
public void onClick(View v)
switch(v.getId())
case R.id.exit :
finish();
break;
public class RefreshThread implements Runnable
@Override
public void run()
while(bool)
try
Thread.sleep(5000);//每五秒刷新一次
catch (InterruptedException e)
e.printStackTrace();
synchronized (this)
//用post方法刷新
text.post(new Runnable()
@Override
public void run()
text.append("Hello World...n");
);
@Override
protected void onDestroy()
super.onDestroy();
bool = false;
参考技术A 可以实现的,不过scrollview嵌套listview的时候会导致listview只显示一个条目,你可以计算listview子item的高度,然后加起来设定listview高度,但是这样的listview失去了高性能,如果一定要使用scrollview和listivew嵌套,不如就把scrollview中listview上面的东西做成listview的header,下面的做成footer,这样就不用scrollview了。另,谷歌的supportv4包更新了,出了一个layout叫SwipeRefreshLayout,是单独的一个下拉刷新layout,你可以更新后使用它,这个下拉控件可以应用到任何控件上,比如listview,gridview,webview,等等。android解决ScrollView嵌套ListView不能下拉刷新
为了不误导新人,这篇帖子写的比较早了,这里2016年2月23日21:33:20更新的内容:
千万不要在实际开发中用scrollview嵌套listview\\recylerview来处理滑动嵌套, 这是种处理是相当影响性能的,之前这么做完全是抱着学习的态度,顺着嵌套的情况如何通过事件拦截的机制解决该情景.
但如果我们在实际开发中,遇到listview上方有一大块headview的scrollview里面,一定只用一个listview就好了.无论headview再复杂,都是可以去addview,然后封装到listview里面,只需要对外暴露对应更新view控件的方法即可.近期会更新一片博客+源码,到时候在贴链接~~~~
----------------------------华丽分割线--------------------------------------------------------
之前写了篇文章android(仿QQ向右滑动退出)在viewpager中onTouchEvent无法监听到ACTION_DOWN的getX的值,代码.其实总结起来也就是ViewGroup嵌套ViewGroup,在点击View的事件拦截与传递机制的问题.之前那篇文章虽然能按照那个方法解决问题,但是究其原因并未清楚领悟和掌握,为了不误导同学,加之最近阅读了相关书籍,在写一篇文章来说明这个问题.
附上在开发过程中遇到的解决ScrollView嵌套ListView,不能下拉刷新的案例源码.
一.ViewGroup和View内的点击事件和其作用
ViewGroup内部关于点击事件有三个方法:
dispatchTouchEvent()-------负责事件传递或者向下分发,在事件分发的时候,这个方法很少重写
onInterceptTouchEvent()-------负责事件传递或者向下分发,在事件分发的时候,一般重写这个方法获取相关坐标或者位置
onTouchEvent()------------负责事件处理,直接写点击事件的业务逻辑代码即可
如果不好理解的话,举个例子:如果界面仅有一个ViewGroup里面,用户点击页面→经过ViewGourp的dispatchTouchEvent()→onInterceptTouchEvent(),无论这两个方法返回的true或者false,都会是按照这个顺序传递事件.但如果onInterceptTouchEvent()返回true→表示事件拦截,不向下传递(不向内部嵌套的ViewGroup或者View传递,因此嵌套的ViewGroup或者View没办法处理这次用户的点击事件),交由本ViewGroup的onTouchEvent()来处理这次的点击事件.为了方便理解给大家画个图.
View内部关于点击事件有三个方法:
dispatchTouchEvent()-------负责事件传递或者向下分发,在View里面,这个方法不用重写,因为View本身就置于最底层了,只需要做事件消费即可
onTouchEvent()------------负责事件处理,直接写点击事件的业务逻辑代码即可
注:下图如果返回True是红叉,表示上下方向不走了,也就是不向下传递了,直接消费,消费如果return True是红叉,就表示此次点击事件到此终结了.
分发事件的顺序是:父→子,向下传递
消费事件的顺序是:子→父,向上传递.消费和分发的顺序是反着的,大家看下图也就明白了
scrollview嵌套listview,相当于一个viewgroup里面对view的用户ontouch事件,根据上图,如果在实际过程中listview刷新很难实现的话,就尝试在刷新的时候,阻止scrollview截获用户的touch事件,因为我就想要listview来消费这次的用户touch事件,避免父级的viewgroup也就是scrollview来分发这次的事件,这就是我解决这个问题的思路,那么将会用到这个方法requestDisallowInterceptTouchEvent(false),通俗点来说,也就是底层的view直接跳过包裹在外层的父级的viewgroup直接处理这次ontouch事件.
关于requestDisallowInterceptTouchEvent(false),有兴趣的童鞋可以看看这篇博文http://blog.csdn.net/chaihuasong/article/details/17499799,写得比较详细.其实总结起来也就是我上面说的.
好了,这里直接上解决的关键代码,注释写得很详细,有兴趣的童鞋可以直接下源码直接使用,或者有更好的解决方案的话,也可以给我留言,大家相互学习.(*^__^*)
/************************关键代码**************
* 暂时想到的这个方案,当listview滑动到最顶部的时候,拦截scrollview事件,listview可以刷新
* 反之,取消拦截scrollview事件,listview不能刷新
* ******************************/
mListView.setOnTouchListener(new OnTouchListener()
@Override
public boolean onTouch(View v, MotionEvent event)
int localheight = 0;
switch (event.getAction())
case MotionEvent.ACTION_DOWN:
localheight = (int) event.getY();
break;
case MotionEvent.ACTION_MOVE:
int sY = (int) event.getY();
int scrollY = mScrollView.getScrollY();
int height = mScrollView.getHeight();
int scrollViewMeasuredHeight = mScrollView.getChildAt(0)
.getMeasuredHeight();
//这个表示,当滑动到scrollview顶部的时候,
if (scrollY == 0)
//检测到在listview里面手势向下滑动的手势,就下拉刷新,反之,则无法触发下拉刷新
if (localheight - sY > 10)
// 取消拦截scrollview事件,listview不能刷新
mScrollView.requestDisallowInterceptTouchEvent(false);
break;
// 拦截scrollview事件,listview可以刷新
mScrollView.requestDisallowInterceptTouchEvent(true);
//这个表示scrollview没恢复到顶部,在listview里面是无法触发下拉刷新的
else
// 取消拦截scrollview事件,listview不能刷新
mScrollView.requestDisallowInterceptTouchEvent(false);
//滑动到底部的时候,自动去加载更多.
if ((scrollY + height) == scrollViewMeasuredHeight)
// 滑到底部触发加载更多
onLoadMore();
break;
case MotionEvent.ACTION_UP:
localheight = 0;
break;
default:
break;
return false;
);
以上是关于android开发怎么刷新 scrollview的主要内容,如果未能解决你的问题,请参考以下文章