android使用 ScrollerView 实现 可上下滚动的分类栏实例

如果不考虑更深层的性能问题,我个人认为ScrollerView还是很好用的。而且单用ScrollerView就可以实现分类型的RecyclerView或ListView所能实现的效果。

下面我单单从效果展示方面考虑,使用ScrollerView实现如下图所示的可滚动的多条目分类,只是为了跟大家一起分享一下新思路。(平时:若从复用性等方面考虑,这显然是存在瑕疵的~)

特点描述:

1.可上下滚动

2.有类似于网格布局的样式

3.子条目具有点击事件

刚看到这个效果时,首先想到的是使用分类型的RecyclerView 或者 ListView  ,里面再嵌套GridView来实现。

但转而又一想ScrollerView也可以滚动,只要往里面循环添加子item不就可以了吗。

实现的逻辑大致如下:

具体的实现如下:

第一步:布局里写一个ScrollerView,里面添加一个竖直的线性布局

第二步:实例化垂直线性布局

allhonor_hscroll = (LinearLayout) findViewById(R.id.allhonor_hscroll); 

第三步:联网请求获取数据

setAllHonorData(); 
/**
  * 使用okhttp
  */
  public void setAllHonorData() {
    OkHttpUtils
        .get()
        .url(url)
        .build()
        .execute(new StringCallback() {
          @Override
          public void onError(okhttp3.Call call, Exception e, int id) {
            Log.e("TAG", "111");
            Log.e("TAG", "onError" + e.getMessage());
          } 

          @Override
          public void onResponse(String response, int id) {
            Log.e("TAG", "222");
            Log.e("TAG", "onRespons" + response); 

            //联网成功后使用fastjson来解析数据
            processData(response);
          } 

          @Override
          public void onBefore(Request request, int id) {
          } 

          @Override
          public void onAfter(int id) {
          } 

        });
  }
/**
   * 使用fastjson进行解析
   *
   * @param json
   */
  private void processData(String json) {
    //使用GsonFormat生成对应的bean类
    com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(json);
    String data = jsonObject.getString("data");
    List<AllHonorBean.HornorBean> hornorsList = JSON.parseArray(data, AllHonorBean.HornorBean.class); 

    //测试是否解析数据成功
//    String strTest = hornorsList.get(0).getRegion();
//    Log.e("TAG", strTest); 

    //第四步:装配数据,使用两层for循环 

  }

第四步:设置两种item的布局

第一种item布局:item_allhornors0.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:background="#ffffff"
  android:orientation="vertical"> 

  <TextView
    android:id="@+id/tv_allhornors_big"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#11000000"
    android:gravity="center_vertical"
    android:paddingBottom="12dp"
    android:paddingLeft="13dp"
    android:paddingTop="12dp"
    android:text="热门"
    android:textColor="#000000"
    android:textSize="14sp" /> 

  <View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#11000000" /> 

</LinearLayout>

第二种item布局:item_allhornors1.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:background="#ffffff"
  android:orientation="vertical"> 

  <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"> 

    <TextView
      android:id="@+id/tv_allhornors_sn0"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:clickable="true"
      android:gravity="center"
      android:paddingBottom="12sp"
      android:paddingTop="12sp"
      android:text="你好你好"
      android:textColor="#000000"
      android:textSize="13sp" /> 

    <View
      android:layout_width="1dp"
      android:layout_height="match_parent"
      android:background="#11000000" /> 

    <!--注意这里的text文本一定要为空,不要设置任何内容-->
    <TextView
      android:id="@+id/tv_allhornors_sn1"
      android:layout_width="0dp"
      android:layout_height="wrap_content"
      android:layout_weight="1"
      android:clickable="true"
      android:gravity="center"
      android:paddingBottom="12sp"
      android:paddingTop="12sp"
      android:text=""
      android:textColor="#000000"
      android:textSize="13sp" />
  </LinearLayout> 

  <View
    android:layout_width="match_parent"
    android:layout_height="1dp"
    android:background="#11000000" /> 

</LinearLayout>

第五步:装配数据

if (hornorsList != null && hornorsList.size() > 0) {
      //-->外层
      for (int i = 0; i < hornorsList.size(); i++) {
        //创建并添加第一种item布局
        View globalView = View.inflate(this, R.layout.item_allhornors0, null);
        TextView tv_allhornors_big = (TextView) globalView.findViewById(R.id.tv_allhornors_big);
        AllHonorBean.HornorBean hornorsListBean = hornorsList.get(i);
        String region = hornorsListBean.getRegion();
        //外层for中直接装配数据
        tv_allhornors_big.setText(region);
        //将布局添加进去
        allhonor_hscroll.addView(globalView); 

        List<AllHonorBean.HornorBean.FestivalsBean> festivalsList = hornorsListBean.getFestivals();
        //-->内层,每次装两个数据
        for (int j = 0; j < festivalsList.size(); j = j + 2) {
          //创建并添加第二种item布局
          View smallView = View.inflate(this, R.layout.item_allhornors1, null);
          final TextView tv_sn0 = (TextView) smallView.findViewById(R.id.tv_allhornors_sn0);
          TextView tv_sn1 = (TextView) smallView.findViewById(R.id.tv_allhornors_sn1); 

          //顺带在这里就直接添加点击事件的监听
          if (j < festivalsList.size() - 1) {
            setListener(tv_sn0, tv_sn1);
          } 

          //装配左边的数据
          honorName0 = festivalsList.get(j).getFestivalName();
          tv_sn0.setText(honorName0); 

          //判读越界否
          if (j < festivalsList.size() - 1) {
            //装配右边的数据
            honorName1 = festivalsList.get(j + 1).getFestivalName();
            tv_sn1.setText(honorName1);
          } 

          //添加进去
          allhonor_hscroll.addView(smallView);
        }
      }
    }

点击事件的监听:

private void setListener(final TextView tv_sn0, final TextView tv_sn1) {
    //给左边的TextView 设置监听
    tv_sn0.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        Toast.makeText(MainActivity.this, "" + tv_sn0.getText(), Toast.LENGTH_SHORT).show();
      }
    }); 

    //给右边的TextView 设置监听
    tv_sn1.setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
        Toast.makeText(MainActivity.this, "" + tv_sn1.getText(), Toast.LENGTH_SHORT).show();
      }
    });
  }

完成~

再看一眼最后效果:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android Scroller大揭秘

    在学习使用Scroller之前,需要明白scrollTo().scrollBy()方法. 一.View的scrollTo().scrollBy() scrollTo.scrollBy方法是View中的,因此任何的View都可以通过这两种方法进行移动.首先要明白的是,scrollTo.scrollBy滑动的是View中的内容(而且还是整体滑动),而不是View本身.我们的滑动控件如SrollView可以限定宽.高大小,以及在布局中的位置,但是滑动控件中的内容(或者里面的childView)可以是无

  • Android程序开发之UIScrollerView里有两个tableView

    一,效果图. 二,工程图. 三,代码. RootViewController.h #import <UIKit/UIKit.h> @interface RootViewController : UIViewController <UIScrollViewDelegate,UITableViewDelegate,UITableViewDataSource> { UIScrollView *_scrolView; UITableView *_tableView; UITableView

  • Android Scroller及下拉刷新组件原理解析

    Android事件拦截机制 Android中事件的传递和拦截和View树结构是相关联的,在View树中,分为叶子节点和普通节点,普通节点有子节点只能是ViewGroup,叶子节点可以是View或者ViewGroup.Android和事件分发拦截相关的方法有 dispatchTouchEvent(MotionEvent ev) 事件分发相关的方法,沿着View树将一个用户的触摸事件向下分发. onInterceptTouchEvent(MotionEvent ev) 在dispatchTouchE

  • Android Scroller完全解析

    在Android中,任何一个控件都是可以滚动的,因为在View类当中有scrollTo()和scrollBy()这两个方法,如下图所示: 这两个方法的主要作用是将View/ViewGroup移至指定的坐标中,并且将偏移量保存起来.另外: mScrollX 代表X轴方向的偏移坐标 mScrollY 代表Y轴方向的偏移坐标 这两个方法都是用于对View进行滚动的,那么它们之间有什么区别呢?简单点讲,scrollBy()方法是让View相对于当前的位置滚动某段距离,而scrollTo()方法则是让Vi

  • 详解Android Scroller与computeScroll的调用机制关系

    Android ViewGroup中的Scroller与computeScroll的有什么关系? 答:没有直接的关系 知道了答案,是不是意味着下文就没必要看了,如果说对ViewGroup自定义控件不感兴趣,可以不用看了. 1.Scroller到底是什么? 答:Scroller只是个计算器,提供插值计算,让滚动过程具有动画属性,但它并不是UI,也不是滑动辅助UI运动,反而是单纯地为滑动提供计算. 无论从构造方法还是其他方法,以及Scroller的属性可知,其并不会持有View,辅助ViewGrou

  • 深入理解Android中Scroller的滚动原理

    View的平滑滚动效果 什么是实现View的平滑滚动效果呢,举个简单的例子,一个View从在我们指定的时间内从一个位置滚动到另外一个位置,我们利用Scroller类可以实现匀速滚动,可以先加速后减速,可以先减速后加速等等效果,而不是瞬间的移动的效果,所以Scroller可以帮我们实现很多滑动的效果. 首先我们先来看一下Scroller的用法,基本可概括为"三部曲": 1.创建一个Scroller对象,一般在View的构造器中创建: public ScrollViewGroup(Cont

  • 详解Android应用开发中Scroller类的屏幕滑动功能运用

    今天给大家介绍下Android中滑屏功能的一个基本实现过程以及原理初探,最后给大家重点讲解View视图中scrollTo 与scrollBy这两个函数的区别 .   首先 ,我们必须明白在Android View视图是没有边界的,Canvas是没有边界的,只不过我们通过绘制特定的View时对Canvas对象进行了一定的操作,例如 : translate(平移).clipRect(剪切)等,以便达到我们的对该Canvas对象绘制的要求 ,我们可以将这种无边界的视图称为"视图坐标"----

  • android使用 ScrollerView 实现 可上下滚动的分类栏实例

    如果不考虑更深层的性能问题,我个人认为ScrollerView还是很好用的.而且单用ScrollerView就可以实现分类型的RecyclerView或ListView所能实现的效果. 下面我单单从效果展示方面考虑,使用ScrollerView实现如下图所示的可滚动的多条目分类,只是为了跟大家一起分享一下新思路.(平时:若从复用性等方面考虑,这显然是存在瑕疵的~) 特点描述: 1.可上下滚动 2.有类似于网格布局的样式 3.子条目具有点击事件 刚看到这个效果时,首先想到的是使用分类型的Recyc

  • Android仿微博个人详情页滚动到顶部的实例代码

    个人详情页滑动到顶部 最近产品提了个新需求,需要实现点击App内的某个按钮跳转到个人详情页并且滑动到顶部,个人详情页的页面交互稍微复杂,技术角度上包含了状态栏颜色变换,view滑动联动等问题,技术实现上采用了Google出的CoordinatorLayout那套组件,由于App的个人详情页跟微博的相似,这里就拿微博为例来描述.微博默认的效果以及手动滑动到顶部的效果图如下. 个人详情页技术实现分析: 先看看xml布局的伪代码: <?xml version="1.0" encodin

  • Android实现listview滑动时渐隐渐现顶部栏实例代码

    我在开发的时候遇到了这样的需求,就是在listview的滑动中,需要对顶部的栏目由透明慢慢的变为不透明的状态,就是以下的效果 最先开始的时候想的很简单,无非就是监听listview的滑动距离,然后根据距离算出透明度的比值,就可以了,但是事实上呢也的确是这样做的 只是在获取listview的滑动距离上可能没法直接获取,需要动态的去计算 下面贴出全部代码吧,不想码字了,最近感冒了,脑袋晕乎乎的,还疼,代码更直观一些 private void initListener() { lvList.setOn

  • Android模仿实现微博详情页滑动固定顶部栏的效果实例

    前言 最近项目中遇到一个需求,类似微博详情页的效果,通过查找相关的资料终于找了对应的解决方案,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 先来看下我们今天要实现的效果: 滑动固定顶部栏效果图 这段时间公司准备重构一个项目,刚好用到这个效果,我就顺带写了篇文章,关于这个效果网上可以找到一些相关资料的,昨晚看了一些,感觉都不是很好,有点模棱两可的样子,也没提到需要注意的一些关键点,这里来做下整理,由于涉及到公司的代码,这里我就写个简单的Demo来讲解. 简单Demo 传统套路:

  • android开发实现列表控件滚动位置精确保存和恢复的方法(推荐)

    Android开发经常要对列表的滚动位置进行保存和恢复,网上也有很多关于此功能的方法文章,但绝大多数都只能保存恢复到某一行,对于滚动到半行的情况不能精确的恢复.也有很多文章介绍了好几种方法,也说某些方法能够精确的控制,但实际上根本不能实现.还有些介绍了很多玄乎且非常复杂的方法,但也没看到能完整实现的代码. 经过一段时间的研究测试,下面的代码可以完美的实现列表滚动位置的精确保存和恢复,而且只是在原来记忆到行位置的基础上增加了2行代码而已. 具体见下面代码和注释: //保存位置: int posit

  • Android高仿京东垂直循环滚动新闻栏

    实现思路其实很简单,就是一个自定义的LinearLayout,并且textView能够循环垂直滚动,而且条目可以点击,显示区域最多显示2个条目,并且还有交替的属性垂直移动的动画效果,通过线程来控制滚动的实现. 不多说看效果: 代码实现 我们先来为控件设置自定义属性: <?xml version="1.0" encoding="utf-8"?> <resources> <declare-styleable name="JDAdv

  • Android 使用CoordinatorLayout实现滚动标题栏效果的实例

    在Material Design里,CoordinatorLayout通常用来作为顶层视图,来协调处理各个子View之间的动作,从而实现各种动画效果,如Snackbar与FloatingActionButton的配合显示效果,就是以CoordinatorLayout作为根布局来实现的 CoordinatorLayout提供Behaviors接口,子View通过实现Behaviors接口来协调和其它View之间的显示效果,可以这么理解: CoordinatorLayout让其子View之间互相知道

  • Android编程实现TextView垂直自动滚动功能【附demo源码下载】

    本文实例讲述了Android编程实现TextView垂直自动滚动功能.分享给大家供大家参考,具体如下: 在做android 应用的开发的时候,横向滚动或者要做出跑马灯的效果很简单,textview本身的属性就支持,只要设置准确就会滚动,开发起来比较简单,但是textview 不支持垂直滚动,那么垂直滚动就需要自己来实现了,很多网友提供的垂直滚 动方案都是千篇一律,使用ScrollView来进行滚动,但是都不完美,做起来有些别扭.有一位网友给出的歌词的滚动思路明确,能从根本上解决问题,因此我实现的

  • Android简单记录和恢复ListView滚动位置的方法

    本文实例讲述了Android简单记录和恢复ListView滚动位置的方法.分享给大家供大家参考,具体如下: 有时候我们需要记录当前ListView滚动到的位置,重新加载的时候要回到原位,不罗嗦,给出代码: //列表滚动 private OnScrollListener ScrollLis = new OnScrollListener() { @Override public void onScroll(AbsListView arg0, int arg1, int arg2, int arg3)

  • Android仿UC浏览器左右上下滚动功能

    本文要解决在侧滑菜单右边加个文本框,并能实现文本的上下滑动和菜单的左右滚动.这里推荐可以好好看看android的触摸事件的分发机制,这里我就不详细讲了,我只讲讲这个应用.要实现的功能就像UC浏览器(或其它手机浏览器)的左右滚动,切换网页,上下滚动,拖动内容. 本文的效果: 一.功能要求与实现 1.功能要求: (1)手指一开始按着屏幕左右移动时,只能左右滚动菜单,如果这时手指一直按着,而且上下移动了,那么菜单显示部分保持不变,但文本框也不上下移动!                       (2

随机推荐