怎么在RecyclerView中动态加载和移除控件,并且RecyclerView的宽高保持自适应!
我准备实现如题所述的效果,我使用了ViewStub,但是发现存在一些问题,比如ViewStub只能加载一个新布局,RecyvlerView能够自适应,但ViewStub却不能移除它的布局,只能设置隐藏,隐藏之后RecyclerView并不能回到原来的宽高。我自己写了一个简陋的demo来尝试。
代码如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/expendContainer"
android:background="@color/colorAccent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/colorPrimary">
<TextView
android:id="@+id/expendItem"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="24sp"
android:text="展开"/>
<ToggleButton
android:gravity="center"
android:id="@+id/expendToggleButton"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
<ViewStub
android:id="@+id/expendView"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:background="@color/colorPrimaryDark"
android:layout="@layout/expend_view"/>
</LinearLayout>
上面是item布局的代码
主布局就只是RecyclerView。
然后ManActivity的代码很简单仅仅是加载RecyclerView而已。
下面是adapter的代码:
public class ExpendRecyclerAdapter extends RecyclerView.Adapter<ExpendViewHolder> {
public Context mContext;
private View view;
public ExpendRecyclerAdapter(Context context) {
mContext = context;
}
@Override
public ExpendViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
view = LayoutInflater.from(mContext).inflate(R.layout.expend_item,parent,false);
ExpendViewHolder expendViewHolder = new ExpendViewHolder(view);
return expendViewHolder;
}
@Override
public void onBindViewHolder(final ExpendViewHolder holder, final int position) {
holder.expendItem.setText("需要展示的数据");
holder.expendToggleButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.expendToggleButton.isChecked()){
holder.expendView.setVisibility(View.VISIBLE);
}else {
holder.expendView.setVisibility(View.INVISIBLE);
holder.expendContainer.removeView(holder.expendView);
notifyItemChanged(position);
}
}
});
}
@Override
public int getItemCount() {
return 1;
}
}
效果如图:点击ToggleButton,加载布局
如果我不写notifyItemChanged(position);那么再点击的话,布局会被隐藏,但是宽高仍然不会改变,下面的粉红色布局部分不会消失。
如果我写了notifyItemChanged(position);再次点击,item刷新了一下,奇迹发生,下面的小粉红不见了!
但是当我再次开关,尽管item不断刷新,下面的粉红部分就再也不消失了,直到我转到其他Activity再转回来,小粉红消失。
也就是说,不管是第一次notifyItemChanged(position);刷新Recycler时粉红部分消失,还是进入后台再进入前台时粉红部分的消失,都表示,RecyclerView是可以适应item内容的动态变化而动态变化的。
但是我现在思路受阻,希望有大神能够指点一下!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
新版本的recyclerview有个新特性,是会动态计算item的宽高。不知道有没有帮助。
http://kingideayou.github.io/2016/03/01/recycler_view_23.2/
如果有空的话我尝试一下这个方案:http://www.jianshu.com/p/9165249da2fa