1. 项目需求:
如下,如果没有向下箭头(显示/隐藏剩余搜索词条)的话,采用flexbox-layout+Recycleview+FlexboxLayoutManager 可以实现流式布局。
加了这个箭头,做起来有点复杂,体现在:
1 怎么知道搜索词条总的数量超过2行了?
2 箭头应该在哪个位置出现?
原有的FlexboxLayoutManager 并没有提供类似的方法或是监听告知。可能需要用到自定义view来做特殊处理
2. 代码实现:
方案:采用FlowLayout,这里借鉴了FlowLayout,
思路:判断当前词条是否已经超过了2行,如果超过了2行,就获取到第2行最后一个view的索引值,然后在词条库中将此索引值对应的词条更改为特殊标记。当flowlayout获取到这个特殊标记时候,做相应的处理。
FlowLayout修改如下:
关键是:
//OnLayout中:
if(lineCount==1){
//第二行数据,并且有超过限定行数的时候
lastGoneView = child;
lastGoneView.setTag(i);//将此view的索引值放入tag中
Log.d("HXY","CountIndex="+i);
}
1. FlowLayout
public class FlowLayout extends ViewGroup {
private static final String TAG = "FlowLayout";
private static final int LEFT = -1;
private OnTagClickListener mOnTagClickListener;
private int limitLineCount; //默认显示3行 断词条显示3行,长词条显示2行
private boolean isLimit; //是否有行限制
private boolean isOverFlow; //是否溢出2行
private View lastGoneView;//被隐藏的最后一个view
public View getLastGoneView() {
return lastGoneView;
}
protected List<List<View>> mAllViews = new ArrayList<List<View>>();
protected List<Integer> mLineHeight = new ArrayList<Integer>();
protected List<Integer> mLineWidth = new ArrayList<Integer>();
private List<View> lineViews = new ArrayList<>();
public boolean isOverFlow() {
return isOverFlow;
}
private void setOverFlow(boolean overFlow) {
isOverFlow = overFlow;
}
public boolean isLimit() {
return isLimit;
}
public void setLimit(boolean limit) {
if (!limit) {
setOverFlow(false);
}
isLimit = limit;
requestLayout();
}
public FlowLayout(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
limitLineCount = 2;
isLimit = true;
}
public FlowLayout(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public FlowLayout(Context context) {
this(context, null);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int sizeHeight = MeasureSpec.getSize(heightMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
// wrap_content
int width = 0;
int height = 0;
int lineWidth = 0;
int lineHeight = 0;
//在每一次换行之后记录,是否超过了行数
int lineCount = 0;//记录当前的行数
int cCount = getChildCount();
for (int i = 0; i < cCount; i++) {
View child = getChildAt(i);
if (child.getVisibility() == View.GONE) {
if (i == cCount - 1) {
if (isLimit) {
if (lineCount == limitLineCount) {
setOverFlow(true);
break;
} else {
setOverFlow(fa