【android】RecyclerView中动态添加子控件和改变ViewHolder高度

想要跨平台,就要对平台有了解,最近在看android开发。在为RecyclerView中动态添加子控件改变ViewHolder高度时遇到了几个坑,费了不少时间填坑,所以记录一下。

这个是效果图:

本文demo链接:https://github.com/zhangzhaopds/RecyclerView_demo.git

点击cell,那么cell的高度就会增加一倍,同时,在cell上面添加一个控件。

关于改变高度的注意点:

在线性布局或者相对布局动态设置宽高时,要先看有没有外层布局,
如果有要看外层布局是什么,是LinearLayout,则要用LinearLayout.LayoutParams,
如果是RelativeLayout则要用RelativeLayout.LayoutParams,而不是看你要控制的是什么布局,如果外层没有布局文件则要用FrameLayout.LayoutParams

关于新增控件的注意点:

如果父视图是RelativeLayout 或者 FrameLayout,无法动态添加控件,
解决的办法是新建一个LinearLayout,然后把textView添加给它,
再把这个LinearLayout添加给父视图:

主要的代码:

holder.mTextView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                clickedArr.set(position, !clickedArr.get(position));
                if (clickedArr.get(position)) {

                    TextView showView = new TextView(currentView.getContext());
                    showView.setTextColor(Color.WHITE);
                    showView.setText("新增的位置:" + position + ", 高度增加一倍");
                   // 改变高度
                    FrameLayout.LayoutParams linearParams =  (FrameLayout.LayoutParams)relativesArr.get(position).getLayoutParams();
                    linearParams.height = 200;
                    relativesArr.get(position).setLayoutParams(linearParams);
                    // 新增控件
                    LinearLayout.LayoutParams param1 = new LinearLayout.LayoutParams(
                            ViewGroup.LayoutParams.MATCH_PARENT, 40);
                    param1.setMargins(20, 120, 0, 0);
                    showView.setLayoutParams(param1);

                    LinearLayout linear = new LinearLayout(currentView.getContext());
                    linear.setOrientation(LinearLayout.VERTICAL);
                    linear.addView(showView);

                    subViewsArr.set(position, linear);
                    relativesArr.get(position).addView(linear);
                } else {
                    Log.i("Card", "onClick: cuo " + clickedArr.get(position));
                  // 移除控件
                    relativesArr.get(position).removeView(subViewsArr.get(position));
                  // 返回原先高度100
                    FrameLayout.LayoutParams linearParams =  (FrameLayout.LayoutParams)relativesArr.get(position).getLayoutParams();
                    linearParams.height = 100;
                    relativesArr.get(position).setLayoutParams(linearParams);
                }
            }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值