自定义Textview显示自动换行
2017-05-31 15:11
302 查看
实现多个textview字符串一行显示,展示不下自动换行
可直接使用
调用此view进行添加数据
传递数据集合,进行遍历赋值
可直接使用
package com.sanbanhui.helper.widget; import android.content.Context; import android.util.AttributeSet; import android.view.View; import android.view.ViewGroup; import java.util.ArrayList; import java.util.List; /** * 自定义流布局 * @author zhouyou */ public class ZFlowLayout extends ViewGroup { // 存储所有子View private List<List<View>> mAllChildViews = new ArrayList<>(); // 每一行的高度 private List<Integer> mLineHeight = new ArrayList<>(); public ZFlowLayout(Context context) { this(context, null); } public ZFlowLayout(Context context, AttributeSet attrs) { this(context, attrs, 0); } public ZFlowLayout(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); } @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); // 如果当前ViewGroup的宽高为wrap_content的情况 int width = 0;// 自己测量的 宽度 int height = 0;// 自己测量的高度 // 记录每一行的宽度和高度 int lineWidth = 0; int lineHeight = 0; // 获取子view的个数 int childCount = getChildCount(); for(int i = 0;i < childCount; i++){ View child = getChildAt(i); // 测量子View的宽和高 measureChild(child, widthMeasureSpec, heightMeasureSpec); // 得到LayoutParams MarginLayoutParams lp = (MarginLayoutParams) getLayoutParams(); // 子View占据的宽度 int childWidth = child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin; // 子View占据的高度 int childHeight = child.getMeasuredHeight() + lp.topMargin + lp.bottomMargin; // 换行时候 if(lineWidth + childWidth > sizeWidth){ // 对比得到最大的宽度 width = Math.max(width, lineWidth); // 重置lineWidth lineWidth = childWidth; // 记录 4000 行高 height += lineHeight; lineHeight = childHeight; }else{// 不换行情况 // 叠加行宽 lineWidth += childWidth; // 得到最大行高 lineHeight = Math.max(lineHeight, childHeight); } // 处理最后一个子View的情况 if(i == childCount -1){ width = Math.max(width, lineWidth); height += lineHeight; } } // wrap_content setMeasuredDimension(modeWidth == MeasureSpec.EXACTLY ? sizeWidth : width, modeHeight == MeasureSpec.EXACTLY ? sizeHeight : height); } @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { mAllChildViews.clear(); mLineHeight.clear(); // 获取当前ViewGroup的宽度 int width = getWidth(); int lineWidth = 0; int lineHeight = 0; // 记录当前行的view List<View> lineViews = new ArrayList<View>(); int childCount = getChildCount(); for(int i = 0;i < childCount; i ++){ View child = getChildAt(i); MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); int childWidth = child.getMeasuredWidth(); int childHeight = child.getMeasuredHeight(); // 如果需要换行 if(childWidth + lineWidth + lp.leftMargin + lp.rightMargin > width){ // 记录LineHeight mLineHeight.add(lineHeight); // 记录当前行的Views mAllChildViews.add(lineViews); // 重置行的宽高 lineWidth = 0; lineHeight = childHeight + lp.topMargin + lp.bottomMargin; // 重置view的集合 lineViews = new ArrayList(); } lineWidth += childWidth + lp.leftMargin + lp.rightMargin; lineHeight = Math.max(lineHeight, childHeight + lp.topMargin + lp.bottomMargin); lineViews.add(child); } // 处理最后一行 mLineHeight.add(lineHeight); mAllChildViews.add(lineViews); // 设置子View的位置 int left = 0; int top = 0; // 获取行数 int lineCount = mAllChildViews.size(); for(int i = 0; i < lineCount; i ++){ // 当前行的views和高度 lineViews = mAllChildViews.get(i); lineHeight = mLineHeight.get(i); for(int j = 0; j < lineViews.size(); j ++){ View child = lineViews.get(j); // 判断是否显示 if(child.getVisibility() == View.GONE){ continue; } MarginLayoutParams lp = (MarginLayoutParams) child.getLayoutParams(); int cLeft = left + lp.leftMargin; int cTop = top + lp.topMargin; int cRight = cLeft + child.getMeasuredWidth(); int cBottom = cTop + child.getMeasuredHeight(); // 进行子View进行布局 child.layout(cLeft, cTop, cRight, cBottom); left += child.getMeasuredWidth() + lp.leftMargin + lp.rightMargin; } left = 0; top += lineHeight; } } /** * 与当前ViewGroup对应的LayoutParams */ @Override public LayoutParams generateLayoutParams(AttributeSet attrs) { return new MarginLayoutParams(getContext(), attrs); } }
调用此view进行添加数据
传递数据集合,进行遍历赋值
public void loadInfo() { ViewGroup.MarginLayoutParams layoutParams = new ViewGroup.MarginLayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); layoutParams.setMargins(0, 0, 8, 8);// 设置边距 listName.clear(); hyContent.removeAllViews(); for (int i = 0; i < list_show.size(); i++) { if (list_show.get(i).isFlg() == true) { final RelativeLayout relativeLayout = (RelativeLayout) LayoutInflater.from(this).inflate(R.layout.item_hangye_type, null); tvTitle = (TextView) relativeLayout.findViewById(R.id.hangye_type_tv); img = (ImageView) relativeLayout.findViewById(R.id.hangye_type_image); tvTitle.setText(list_show.get(i).getName()); hyContent.addView(relativeLayout, layoutParams); } } }
相关文章推荐
- 自定义TextView任意长度文本下自动改变文字大小以完全显示
- android中的textview显示汉字不能自动换行的一个解决办法
- android自定义Spinner下拉菜单和AutoCompleteTextView自动显示的(下拉列表框)样式
- 自动换行的textview 自定义view 识别英文
- Android 自定义View 解决 TextView 自动换行排版不整齐
- android自定义Spinner下拉菜单和AutoCompleteTextView自动显示的(下拉列表框)样式
- android自定义Spinner下拉菜单和AutoCompleteTextView自动显示的(下拉列表框)样式
- Android——自定义LinearLayout自动换行,TextView垂直排列。
- 使用Xlistview时TextView自动换行或ScrollView嵌套Listview高度显示不全
- android中的textview显示汉字不能自动换行的一个解决办法
- TextView自动换行以及内容过长全部显示--终极解决办法
- 带背景显示文字,自动换行的MultipleTextView
- 【Android进阶】Android自定义组件之自动换行View,以TextView为例
- Android 自定义TextView 自动换行
- Android——自定义LinearLayout自动换行,TextView垂直排列
- Androi实战—EidtText和TextView显示指定行数,内容过长自动换行问题
- 自定义圆环百分占比view (label文字支持自动换行 和设置显示行数)
- textview中自动换行显示文本内容
- TextView/EditText字体阴影 ,自动换行,焦点获取,输入法回车键前往,自定义光标
- android自定义Spinner下拉菜单和AutoCompleteTextView自动显示的(下拉列表框)样式