之前做项目的时候需要实现一个标签功能,就是通过网络获取的数据进行标签展示,当时是定义了一个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哈哈~