android -----自定义View实现搜索添加到历史纪录

原创 2018年04月16日 16:29:01

===============Flowlayout=============

public class XCflowLayout extends ViewGroup {
    //储存所有子View
    List<List<View>> mAllChildV5iews = new ArrayList<>();
    //每行的高度
    List<Integer> mLineHeight=new ArrayList<>();


    public XCflowLayout(Context context) {
        this(context,null);
    }


    public XCflowLayout(Context context, AttributeSet attrs) {
        this(context, attrs,0);
    }


    public XCflowLayout(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }


    @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;
        //获取一个view的个数
        int childCount = getChildCount();
        //循环获得每个view的数值
        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;
                //记录行高
                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);


        super.onMeasure(widthMeasureSpec, heightMeasureSpec);




    }


    @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) {
        // TODO Auto-generated method stub


        return new MarginLayoutParams(getContext(), attrs);
    }

}




======================MainActivity=====================

public class MainActivity extends AppCompatActivity {
    private String mNames[] = {
            "好好学习","天天向上","我要疯了",
            "学不会啊,怎么办呢","感觉天书一样","神啊,救救我吧!!!!!",
            "八维不倒,末班到老","安卓就是一个坑","跳下来就是一望无际的黑暗",
            "老司机开车,请系好安全套","你一万多的假包真好看","腾讯视频",
            "错误的方式","天道酬勤,恒者能胜","抖音专辑","不想干了 , 我要休息!!!!!!"
    };
    private XCflowLayout mFlowLayout;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initChildViews();


    }
    private void initChildViews(){
        mFlowLayout = (XCflowLayout) findViewById(R.id.flowlayout);
        ViewGroup.MarginLayoutParams lp = new ViewGroup.MarginLayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        lp.leftMargin = 5;
        lp.rightMargin = 5;
        lp.topMargin = 5;
        lp.bottomMargin = 5;
        for(int i = 0; i < mNames.length; i ++){
            TextView view = new TextView(this);
            view.setText(mNames[i]);
            view.setTextColor(Color.BLACK);
            view.setBackgroundColor(Color.GRAY);
            mFlowLayout.addView(view,lp);
        }
    }

}


===============xml=================


<com.aaaa.why.myapplication.MyGroup
    android:id="@+id/mygroup"
    android:layout_width="wrap_content"
    android:layout_height="300dp">

</com.aaaa.why.myapplication.MyGroup>

<Button
    android:id="@+id/button"
    android:textSize="25dp"
    android:layout_gravity="center"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="清空历史记录"
    />



自定义View实现搜索添加到历史纪录

自定义View实现复杂的搜索控件 ====================MainActivity======================= package com.example.lenovo....
  • wangaiminwangaimin
  • wangaiminwangaimin
  • 2017年12月06日 19:27
  • 180

利用Android自定义View实现转盘旋转的效果

Android的自定义View为开发者定义和使用个性化的View提供了很好的支持,想要使用自己定义的View,需要继承View类,并重写构造函数和onDraw()函数。onDraw函数在界面刷新时会被...
  • canchew
  • canchew
  • 2010年05月29日 18:57
  • 17998

Android自定义View——自定义搜索框(SearchView) 非常实用的控件

好多东西写起来太麻烦了,而且我在最开始用的也不是自己写的,所以找了一个非常棒的测试了一下.  转载的 在Android开发中,当系统数据项比较多时,常常会在app添加搜索功能,方便用户能快速...
  • qq_21153627
  • qq_21153627
  • 2017年04月13日 12:13
  • 2103

关于自定义适配器和listview中自定义view是否显示的问题

我在我的listview中每一个item有两个显示事项因为是一个记事本app,所以每个item第一行显示conetnt,第二行显示时间则,排列下来每一行都有两个textview,但是有的时候我的某一项...
  • whh946
  • whh946
  • 2018年03月20日 20:48
  • 23

Android自定义View之蓝牙搜索的涟漪雷达效果: 我在搜索呢,你在哪里呀?

Android自定义View之蓝牙搜索的涟漪雷达效果: 我在搜索呢,你在哪里呀?如有转载,请注明来处,博主也是一个一个字敲出来的。 继上几个月的雷达涟漪效果:http://blog.csdn.net/...
  • xh870189248
  • xh870189248
  • 2017年09月11日 18:03
  • 469

Android开发-将自定义View布局到Layout中并调用

写程序的时候,关于布局方面遇到并解决的问题       1.自定义View及其layout属性.        自定义View:   [java] view pla...
  • judyge
  • judyge
  • 2015年05月30日 16:17
  • 233

自定义View之简单顶部标题栏

自定义Title所用布局:
  • my_worldlet
  • my_worldlet
  • 2015年12月30日 17:28
  • 730

自定义View的实现方法,View工作原理(四)

原文地址: Android自定义View的实现方法,带你一步步深入了解View(四) - 郭霖的专栏 - 博客频道 - CSDN.NET http://blog.csdn.net/guolin_blo...
  • boyupeng
  • boyupeng
  • 2015年08月18日 14:45
  • 2886

Android-自定义View集合

学习安卓几个月了,也有点自己的体会,然而我发现自己真正喜欢的是数据方面的东西,当然android自定义view也很好玩,很体验一些技巧性的东西。也不想自己以前学习过程总结的东西就此淹没,于是我就决定把...
  • Jack__Frost
  • Jack__Frost
  • 2016年12月15日 12:43
  • 1020

【Android自定义View实战】之自定义超简单SearchView搜索框

【Android自定义View实战】之自定义超简单SearchView搜索框 这篇文章是对之前文章的翻新,至于为什么我要重新修改这篇文章?原因如下 1.有人举报我抄袭,原文链接:http://w...
  • u010785585
  • u010785585
  • 2014年07月18日 16:15
  • 11410
收藏助手
不良信息举报
您举报文章:android -----自定义View实现搜索添加到历史纪录
举报原因:
原因补充:

(最多只允许输入30个字)