FlexboxLayout初步探索一

之前做项目的时候需要实现一个标签功能,就是通过网络获取的数据进行标签展示,当时是定义了一个LInearLayout做为父控件,通过获取的数据,通过Asynctask异步开启线程动态添加控件到容器中,基本实现了功能,当是这种方法存在一些问题,我发现的主要有:

1、数据过多的时候加载延迟严重,用户体验不好

2、当数据不足以填充一行的时候数据展示空白区域不固定,界面丑陋

今天无意间发现了FlexboxLayout控件,通过阅读一些已有的文章(https://juejin.im/post/58d1035161ff4b00603ca9c4我参考 的文章)和Google的demo(https://github.com/google/flexbox-layout),我觉得它完全可以解决我发现的问题。于是自己就写了小demo对我需要的功能进行测试。

添加依赖

compile 'com.google.android:flexbox:0.2.5'

我的布局文件如下


   
   

   
   

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    

    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    


    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    

   
   

布局中的背景资源文件

    
    

    
    
    
     
     
    
     
     
    
     
     

    
    

activity 测试代码
package com.google.android.apps.flexbox;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Gravity;
import android.view.ViewGroup;
import android.widget.TextView;

import com.google.android.flexbox.FlexboxLayout;

import java.util.ArrayList;
import java.util.List;

public class TextFlexViewActivity extends AppCompatActivity {
    private List
     
     
      
       strings = new ArrayList<>();
    private FlexboxLayout mFlexboxLayout;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_text_flexview);
        setStringDates();
        mFlexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout);
        addView();
    }

    /**
     * 添加控件
     */
    private void addView() {
        mFlexboxLayout.removeAllViews();
        for (String name : strings) {
            TextView textView = createBaseFlexItemTextView(name);
            textView.setLayoutParams(createDefaultLayoutParams());
            //添加点击事件监听
//        textView.setOnClickListener(new MainActivity.FlexItemClickListener(viewIndex));
            mFlexboxLayout.addView(textView);
        }

    }


    private ViewGroup.LayoutParams createDefaultLayoutParams() {
        FlexboxLayout.LayoutParams lp = new FlexboxLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, Util.dpToPixel(this, 20));
        //它假设每个子项的 layout_flexGrow 属性的值设为 1,那么剩余空间将均匀分配到每个子项。默认为0
        lp.flexGrow = 1;
        lp.setMargins(10, 5, 10, 5);
        return lp;
    }

    /**
     * 动态创建控件
     *
     * @param name
     * @return
     */
    private TextView createBaseFlexItemTextView(String name) {
        TextView textView = new TextView(this);
        textView.setBackgroundResource(R.drawable.action_base_line_bg);
        textView.setText(name);
        textView.setPadding(10, 5, 10, 5);
        textView.setGravity(Gravity.CENTER);
        return textView;
    }

    /**
     * 设置显示的数据
     */
    private void setStringDates() {
        strings.add("积极");
        strings.add("进击的巨人");
        strings.add("小猫");
        strings.add("啰嗦布");
        strings.add("蒙奇.D.路飞");
        strings.add("设置进度");
        strings.add("耗");
        strings.add("物理实验室");
        strings.add("秘密");
        strings.add("世界");
        strings.add("观察者模式");
        strings.add("适配器");
        strings.add("在与不在");
        strings.add("离");
        strings.add("青蛙");
        strings.add("太远");
        strings.add("大剧院的");
        strings.add("太阳");
        strings.add("型芯");
        strings.add("单片机");
        strings.add("桌子");
        strings.add("白");
        strings.add("积极");
        strings.add("进击的巨人");
        strings.add("小猫");
        strings.add("啰嗦布");
        strings.add("蒙奇.D.路飞");
        strings.add("设置进度");
        strings.add("耗");
        strings.add("物理实验室");
        strings.add("秘密");
        strings.add("世界");
        strings.add("观察者模式");
        strings.add("适配器");
        strings.add("在与不在");
        strings.add("离");
        strings.add("青蛙");
        strings.add("太远");
        strings.add("大剧院的");
        strings.add("太阳");
        strings.add("型芯");
        strings.add("单片机");
        strings.add("桌子");
        strings.add("白");
        strings.add("积极");
        strings.add("进击的巨人");
        strings.add("小猫");
        strings.add("啰嗦布");
        strings.add("蒙奇.D.路飞");
        strings.add("设置进度");
        strings.add("耗");
        strings.add("物理实验室");
        strings.add("秘密");
        strings.add("世界");
        strings.add("观察者模式");
        strings.add("适配器");
        strings.add("在与不在");
        strings.add("离");
        strings.add("青蛙");
        strings.add("太远");
        strings.add("大剧院的");
        strings.add("太阳");
        strings.add("型芯");
        strings.add("单片机");
        strings.add("桌子");
        strings.add("白");
        strings.add("积极");
        strings.add("进击的巨人");
        strings.add("小猫");
        strings.add("啰嗦布");
        strings.add("蒙奇.D.路飞");
        strings.add("设置进度");
        strings.add("耗");
        strings.add("物理实验室");
        strings.add("秘密");
        strings.add("世界");
        strings.add("观察者模式");
        strings.add("适配器");
        strings.add("在与不在");
        strings.add("离");
        strings.add("青蛙");
        strings.add("太远");
        strings.add("大剧院的");
        strings.add("太阳");
        strings.add("型芯");
        strings.add("单片机");
        strings.add("桌子");
        strings.add("白");
        strings.add("积极");
        strings.add("进击的巨人");
        strings.add("小猫");
        strings.add("啰嗦布");
        strings.add("蒙奇.D.路飞");
        strings.add("设置进度");
        strings.add("耗");
        strings.add("物理实验室");
        strings.add("秘密");
        strings.add("世界");
        strings.add("观察者模式");
        strings.add("适配器");
        strings.add("在与不在");
        strings.add("离");
        strings.add("青蛙");
        strings.add("太远");
        strings.add("大剧院的");
        strings.add("太阳");
        strings.add("型芯");
        strings.add("单片机");
        strings.add("桌子");
        strings.add("白");
        strings.add("积极");
        strings.add("进击的巨人");
        strings.add("小猫");
        strings.add("啰嗦布");
        strings.add("蒙奇.D.路飞");
        strings.add("设置进度");
        strings.add("耗");
        strings.add("物理实验室");
        strings.add("秘密");
        strings.add("世界");
        strings.add("观察者模式");
        strings.add("适配器");
        strings.add("在与不在");
        strings.add("离");
        strings.add("青蛙");
        strings.add("太远");
        strings.add("大剧院的");
        strings.add("太阳");
        strings.add("型芯");
        strings.add("单片机");
        strings.add("桌子");
        strings.add("白");
        strings.add("积极");
        strings.add("进击的巨人");
        strings.add("小猫");
        strings.add("啰嗦布");
        strings.add("蒙奇.D.路飞");
        strings.add("设置进度");
        strings.add("耗");
        strings.add("物理实验室");
        strings.add("秘密");
        strings.add("世界");
        strings.add("观察者模式");
        strings.add("适配器");
        strings.add("在与不在");
        strings.add("离");
        strings.add("青蛙");
        strings.add("太远");


    }


}

     
     


FlexboxLayout有很多好用的属性,比如适用于各种尺寸的屏幕,横竖屏切换等适配性特别棒,这里我参考的文章写得很好我就不一一列举了。值得一提的一个子布局的属性是flexGrow决定着剩余空间的分布,默认为0,当为1时代表会自动分配剩余空间,在我未设置这个属性之前效果图如下

当我添加了 子项平分剩余空间属性后展示如下:



这样就美观多 了O(∩_∩)O哈哈~



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值