XRecyclerView:对 Recyclerview 举行了扩充,仿照 ListView 达成了
RecyclerView 下拉刷新和上拉加载更加多操作。效果如下:

1 最后效果呈现

图片 1

refresh.gif

正文介绍了react-native
ListView下拉刷新上拉加载达成。分享给我们,具体如下:

react-native ListView下拉刷新上拉加载达成代码,

本文介绍了react-native
ListView下拉刷新上拉加载完毕。共享给大家,具体如下:

先看作用图

图片 2

下拉刷新

React Native提供了三个组件能够兑现下拉刷新方法RefreshControl

应用办法

<ListView
 refreshControl={
 <RefreshControl
 refreshing={this.state.refreshing}
 onRefresh={this._onRefresh.bind(this)}
 />
 }
 //...
</ListView>

在视图加载的时候的时候,将refreshing设置为true,数据加载成功安装为false就能够

上拉加载

应用ListView里的onEndReached方法完毕,ListView在滚动到最后一个Cell的时候,会触发onEndReached方法

先在ListView里加多贰个Footer

render() {
 const FooterView = this.state.loadMore ?
 <View style={styles.footer}>
 <Text style=>加载更多...</Text>
 </View> : null;
 return <ListView
 refreshControl={
 <RefreshControl
  refreshing={this.state.refreshing}
  onRefresh={this._onRefresh.bind(this)}
 />
 }
 style={[styles.listView]}
 dataSource={ds.cloneWithRows(this.state.dataSource)}
 enableEmptySections={true}
 renderRow={this._renderRow.bind(this)}
 onEndReachedThreshold={5}
 onEndReached={this._onEndReached.bind(this)}
 renderFooter={() => FooterView}
 />
 }

在方法_onEndReached里将Footer展现出来,在数据加载成功未来,再遮蔽掉Footer

_onEndReached() {
 this.setState({
 loadMore: true,
 pageNo: this.state.pageNo + 1
 });
 this._fetchData();
 }

说明

ListView里还安装了一个参数onEndReachedThreshold那些参数与onEndReached合营使用,它的情致是:像素的逼近值,该属性和onEndReached合作使用,因为onEndReached滑动截止的声明是以该值作为决断标准的

上述就是本文的全部内容,希望对大家的读书抱有帮助,也盼望大家多多扶助帮客之家。

ListView下拉刷新上拉加载达成代码,
本文介绍了react-native
ListView下拉刷新上拉加载实现。分享给我们,具体如下: 先看功用图
下…

本文实例为大家大饱眼福了android完成ListView下拉刷新上拉加载的求实代码,供我们参考,具体内容如下

图片 3

2 代码完毕思路

(1)自定义控件承袭Listview
(2)增添头布局
(3)增多脚布局
(4)设置触摸监听事件
(5)设置滑动监听事件

先看效果图

图片 4

品种地址 ,应接大家利用,喜欢的话star一下

3 需要get的部分

(1)怎么着通过不一样的触动(DOWN,MOVE,UP)状态,更改头布局的事态,包蕴加载越来越多的进度条、箭头动画、时间的变动。(脚部同样)

 public boolean onTouchEvent(MotionEvent ev) {
        switch (ev.getAction()){
            case MotionEvent.ACTION_DOWN:
                downY = ev.getY();//下拉的位置
                break;
            case MotionEvent.ACTION_MOVE:
                moveY = ev.getY();//移动的位移

                float offset = moveY - downY; // 移动的偏移量

                // 只有 偏移量>0, 并且当前第一个可见条目索引是0, 才放大头部
                if(offset > 0 && getFirstVisiblePosition() == 0){
                    int paddingTop = (int) (- mHeaderViewHeight + offset);//整个是负值,往出拉多少,就将负值减少多少
                    mHeaderView.setPadding(0, paddingTop, 0, 0);

                    if(paddingTop >= 0 && currentState != RELEASE_REFRESH){// 头布局完全显示
                        // 切换成释放刷新模式
                        currentState = RELEASE_REFRESH;
                        updateHeader(); // 根据最新的状态值更新头布局内容
                    }else if(paddingTop < 0 && currentState != PULL_TO_REFRESH){ // 头布局不完全显示
                        // 切换成下拉刷新模式
                        currentState = PULL_TO_REFRESH;
                        updateHeader(); // 根据最新的状态值更新头布局内容
                    }
                    return true; // 当前事件被我们处理并消费
                }
                break;
            case MotionEvent.ACTION_UP:
                // 根据刚刚设置状态
                if(currentState == PULL_TO_REFRESH){
                //- paddingTop < 0 不完全显示, 恢复
                    mHeaderView.setPadding(0, -mHeaderViewHeight, 0, 0);
                }else if(currentState == RELEASE_REFRESH){
                //- paddingTop >= 0 完全显示, 执行正在刷新...
                    mHeaderView.setPadding(0, 0, 0, 0);
                    currentState = REFRESHING;
                    updateHeader();
                }
                break;
            default:
                break;
        }

        return super.onTouchEvent(ev);
    }

(2)当下拉刷新和上拉加载更多事后,数据的收获以及更新。

在View中安装监听接口

 public interface OnRefreshListener{
        void onRefresh();
        void onLoadMore();
    }

    public void setRefreshListener(OnRefreshListener mListener){
        this.mListener = mListener;
    }

在Activity中应用监听接口,监听状态

list_view.setRefreshListener(new RefreshListView.OnRefreshListener() {
            @Override
            public void onRefresh() {
                new Thread(){
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        listDatas.add(0,"下拉刷新出来的数据");

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                refreshAdapter.notifyDataSetChanged();//刷新数据
                                list_view.onRefreshcomplete();
                            }
                        });
                    }
                }.start();
            }

            @Override
            public void onLoadMore() {
                new Thread(){
                    @Override
                    public void run() {
                        try {
                            Thread.sleep(2000);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }

                        listDatas.add("加载更多");

                        runOnUiThread(new Runnable() {
                            @Override
                            public void run() {
                                refreshAdapter.notifyDataSetChanged();
                                list_view.onRefreshcomplete();
                            }
                        });
                    }
                }.start();
            }
        });

图片 5

此番使用的是系统的SwipeRefreshLayout达成下拉刷新,和装置ListView的滑行监听判定是还是不是滑动到最尾部然后加载越多;
其一要比PullToRefreshListView轻易相当多,想PullToRefreshListView达成下拉刷新上拉加载的能够看那篇博客:
android使用PullToRefresh框架达成ListView下拉刷新上拉加载越多

RecyclerView 增添头顶和尾巴布局:本项指标法规正是缘于这里

下拉刷新

关于使用哪类我们可以根据产品的急需接纳,那三种刷新如今甘休世面上只怕使用PullToRefreshListView的比较多;

AnimRefreshRecyclerView:该控件的落到实处原理也是同上,其包括动画

React Native提供了一个零件能够兑现下拉刷新方法RefreshControl

第一说下SwipeRefreshLayout的八个措施:

BeautifulRefreshLayout:里面包蕴了坐着收罗的一部分下拉刷新的控件

选用格局

1、setOnRefreshListener():设置手势滑动监听器。
2、setProgressBackgroundColor():设置进程圈的背景象。
3、setColorSchemeResources():设置进度动画的颜色。
4、setRefreshing():设置组件的洗濯状态。
5、setSize():设置进程圈的大小

在build.gradle中添加:

<ListView
 refreshControl={
 <RefreshControl
 refreshing={this.state.refreshing}
 onRefresh={this._onRefresh.bind(this)}
 />
 }
 //...
</ListView>

本条大家轻易驾驭一下,下边代码中都相继用到;

compile'com.dalu9527:xrecyclerview:0.0.1'

在视图加载的时候的时候,将refreshing设置为true,数据加载成功安装为false就可以

先是说下布局文件,倘若想用SwipeRefreshLayout完成下拉刷新必得把ListView写到SwipeRefreshLayout布局里面;

在布局中选择:

上拉加载

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 android:layout_width="match_parent" 
 android:layout_height="match_parent" 
 android:id="@+id/srfl"> 

 <ListView 
  android:layout_width="match_parent" 
  android:layout_height="match_parent" 
  android:id="@+id/listview" /> 
</android.support.v4.widget.SwipeRefreshLayout> 
<com.xlibs.xrv.view.XRecyclerView android: android:layout_width="match_parent" android:layout_height="match_parent" android:overScrollMode="never" />

选取ListView里的onEndReached方法完结,ListView在滚动到结尾二个Cell的时候,会触发onEndReached方法

本身那边是团结写的小德姆o所以下拉的时候一贯发送三个延时1秒的handler,然后添扩大少刷新adapter;
上拉加载更加多的时候从来给ListVIew设置了叁个滑动监听,判定是或不是滑动到adapter的最上边,然后加载数据,刷新adapter;

RecyclerView 的其它属性不做其它修改

先在ListView里增添多少个Footer

public class MainActivity extends Activity { 
 private ListView mListView; 
 private SwipeRefreshLayout swipeRefreshLayout; 
 private List<String> stringList=new ArrayList<>(); 
 private ArrayAdapter<String> adapter; 
 @Override 
 protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 

  for (int x=0 ; x<16;x++){ 
   stringList.add("新浪微博:搏击爱好者Z"+"---"+x); 
  } 
  initView(); 
 } 

 private void initView() { 
  swipeRefreshLayout= (SwipeRefreshLayout) findViewById(R.id.srfl); 
  //设置进度圈的大小;(这里面只有两个值SwipeRefreshLayout.LARGE和DEFAULT,后者是默认效果) 
  swipeRefreshLayout.setSize(SwipeRefreshLayout.LARGE); 
  //设置进度圈的背景色。这里随便给他设置了一个颜色:浅绿色 
  swipeRefreshLayout.setProgressBackgroundColorSchemeColor(Color.CYAN); 
  //设置进度动画的颜色。这里面最多可以指定四个颜色,我这也是随机设置的,大家知道怎么用就可以了 
  swipeRefreshLayout.setColorSchemeResources(android.R.color.holo_orange_dark 
    ,android.R.color.holo_blue_dark 
    ,android.R.color.holo_red_dark 
    ,android.R.color.widget_edittext_dark); 
  mListView= (ListView) findViewById(R.id.listview); 
  adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, stringList); 
  mListView.setAdapter(adapter); 

  //设置手势滑动监听器 
  swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
   public void onRefresh() { 
    //发送一个延时1秒的handler信息 
    handler.sendEmptyMessageDelayed(199,1000); 
   } 
  }); 

  //给listview设置一个滑动的监听 
  mListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
   //当滑动状态发生改变的时候执行 
   public void onScrollStateChanged(AbsListView view, int scrollState) { 
    switch (scrollState){ 
     //当不滚动的时候 
     case AbsListView.OnScrollListener.SCROLL_STATE_IDLE: 

      //判断是否是最底部 
      if(view.getLastVisiblePosition()==(view.getCount())-1){ 
       for(int x=0;x<5;x++){ 
        stringList.add(stringList.size(),"魔兽世界"+x); 
       } 
       adapter.notifyDataSetChanged(); 
      } 
      break; 
    } 
   } 
   //正在滑动的时候执行 
   public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
   } 
  }); 
 } 

 private Handler handler=new Handler(){ 
  @Override 
  public void handleMessage(Message msg) { 
   if(msg.what==199){ 
    stringList.add(0,"英雄联盟"); 
    adapter.notifyDataSetChanged(); 
    //设置组件的刷洗状态;false代表关闭 
    swipeRefreshLayout.setRefreshing(false); 
   } 
  } 
 }; 
} 

在 Activity or Fragment 中使用:

render() {
 const FooterView = this.state.loadMore ?
 <View style={styles.footer}>
 <Text style=>加载更多...</Text>
 </View> : null;
 return <ListView
 refreshControl={
 <RefreshControl
  refreshing={this.state.refreshing}
  onRefresh={this._onRefresh.bind(this)}
 />
 }
 style={[styles.listView]}
 dataSource={ds.cloneWithRows(this.state.dataSource)}
 enableEmptySections={true}
 renderRow={this._renderRow.bind(this)}
 onEndReachedThreshold={5}
 onEndReached={this._onEndReached.bind(this)}
 renderFooter={() => FooterView}
 />
 }

那个中为了给大家演示SwipeRefreshLayout的多少个办法,假若全体利用暗许能够把setProgressBackgroundColor():setColorSchemeResources():setSize():那多个主意去掉。
与上述同类代码会越来越少,暗中认可效果也非常不易,这一个看我们供给。

基本操作

private XRecyclerView mXRecyclerView;// $ 等价于 findViewById,使用时请使用原来的 findViewById mXRecyclerView = (XRecyclerView)$(R.id.xr_test);// 请勿使用系统本身的 LayoutManager ,而是需要使用以下三种 LayoutManagerXLinearLayoutManager xLinearLayoutManager = new XLinearLayoutManager;// XGridLayoutManager xGridLayoutManager = new XGridLayoutManager;// XStaggeredGridLayoutManager xStaggeredGridLayoutManager = new XStaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL);mXRecyclerView.setLayoutManager(xLinearLayoutManager);// 添加下拉刷新的头部 和 加载更多的底部,如果不加,默认含有下拉刷新的头部,而没有加载更多的底部mHeaderView = LayoutInflater.from.inflate(R.layout.custom_header_view, null);mFooterView = LayoutInflater.from.inflate(R.layout.footer_view, null);mXRecyclerView.addHeaderView(mHeaderView, 50);mXRecyclerView.addFootView(mFooterView, 50);// 设置adapter mMyAdapter = new MyAdapter;mXRecyclerView.setAdapter(mMyAdapter);// 添加下拉刷新 mXRecyclerView.setOnRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { refreshData;// 加载更多(如果没有添加加载更多的布局,下面那LoadMore不会执行)mXRecyclerView.setOnLoadMoreListener(new OnLoadMoreListener() { @Override public void onLoadMore() { loadMoreData;// mXRecyclerView.setEnableRefreshAndLoadMore;// mXRecyclerView.setRefresh; @Overrideprotected void onDestroy() { super.onDestroy(); mXRecyclerView.destroyHandler();}

在方法_onEndReached里将Footer显示出来,在数据加载成功以往,再掩盖掉Footer

源码下载地址.rar)

详见表达

  1. LayoutManager 勿使用系统自个儿的,下边表明其对应的涉嫌

    1. XLinearLayoutManager –> LinearLayoutManager
    2. XGridLayoutManager –> GridLayoutManager
    3. XStaggeredGridLayoutManager –> StaggeredGridLayoutManager
  2. 假若不应用 mXRecyclerView.addHeaderView()
    方法,会有一个暗中认可的下拉刷新布局

  3. mXRecyclerView.addHeaderView(View view, int
    viewHeight),对应的参数分别表示为 下拉刷新尾部 view 和 view
    的中度(必须钦定中度),那一个点子会默许下拉刷新的最大距离为 2
    倍的 viewHeight

  4. mXRecyclerView.addHeaderView(View view, int viewHeight, int
    expandHeight),这一个方法多了五个参数, expandHeight
    代表下拉刷新的滑行距离,最后的滑动距离 为 expandHeight + viewHeight

  5. 设若不采纳 mXRecyclerView.addFootView() 方法,则官样文章加载愈来愈多操作

  6. mXRecyclerView.addFootView(View view, int
    footerHeight),对应的主意参数表示为 上拉加载更加多的 view 和 view
    的可观(必须钦点中度),那几个形式暗中认可是滑倒尾巴部分就能够活动加载

  7. mXRecyclerView.addFootView(View view, int footerHeight, boolean
    is马努al),那个主意多了叁个参数, is马努al
    表示是或不是手动上拉加载触发加载更相当多据, false 代表 自动触发, true
    表示 手动触发,上二个措施默许是 false

  8. setOnRefreshListener 必需声明,不然也就达不到下拉刷新的操作了

  9. setOnLoadMoreListener 可有可无,若无动用 addFootView
    方法,则不用申明

  10. mXRecyclerView.setEnableRefreshAndLoadMore
    代表是或不是开启下拉刷新和加载越多操作,false 表示 不展开, true
    代表开启,暗许是 true

  11. mXRecyclerView.setRefresh
    代表是或不是开启下拉刷新,首要用以第一次加载数据时,自动触发下拉刷新操作,
    false 代表 第一遍加载数据不会接触下拉刷新, true 表示
    会下拉刷新,暗许是 false

  12. mXRecyclerView.destroyHandler() 该措施最棒在 onDestroy() 中调用

_onEndReached() {
 this.setState({
 loadMore: true,
 pageNo: this.state.pageNo + 1
 });
 this._fetchData();
 }

以上正是本文的全体内容,希望对我们的求学抱有扶助,也冀望我们多多帮忙脚本之家。

说明

您恐怕感兴趣的稿子:

  • android
    listview进级实例分享
  • android
    listview早先学习实例代码
  • Android
    ListView落成下拉最上部图片变大效果
  • Android
    ListView与RecycleView的对照使用解析
  • Android开辟完成仿QQ新闻SwipeMenuListView滑动删除置顶成效【附源码下载】
  • android使用PullToRefresh框架达成ListView下拉刷新上拉加载越来越多
  • Android开辟listview选中高亮轻易达成代码分享

ListView里还安装了二个参数onEndReachedThreshold那么些参数与onEndReached合营使用,它的意趣是:像素的逼近值,该属性和onEndReached合作使用,因为onEndReached滑动截止的注脚是以该值作为推断规范的

以上就是本文的全体内容,希望对咱们的上学抱有扶助,也愿意我们多多帮助脚本之家。

你可能感兴趣的稿子:

  • React Native
    自定义下拉刷新上拉加载的列表的演示

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图