想要跨平台,就要对平台有了解,最近在看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);
}
}