怎么在RecyclerView中动态加载和移除控件,并且RecyclerView的宽高保持自适应!

发布于 2022-09-02 10:06:29 字数 3704 浏览 19 评论 0

我准备实现如题所述的效果,我使用了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;
    }
}

clipboard.png
效果如图:点击ToggleButton,加载布局

clipboard.png

如果我不写notifyItemChanged(position);那么再点击的话,布局会被隐藏,但是宽高仍然不会改变,下面的粉红色布局部分不会消失。

clipboard.png

如果我写了notifyItemChanged(position);再次点击,item刷新了一下,奇迹发生,下面的小粉红不见了!
clipboard.png
但是当我再次开关,尽管item不断刷新,下面的粉红部分就再也不消失了,直到我转到其他Activity再转回来,小粉红消失。

也就是说,不管是第一次notifyItemChanged(position);刷新Recycler时粉红部分消失,还是进入后台再进入前台时粉红部分的消失,都表示,RecyclerView是可以适应item内容的动态变化而动态变化的。
但是我现在思路受阻,希望有大神能够指点一下!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

牵你手 2022-09-09 10:06:29

新版本的recyclerview有个新特性,是会动态计算item的宽高。不知道有没有帮助。
http://kingideayou.github.io/2016/03/01/recycler_view_23.2/

天赋异禀 2022-09-09 10:06:29

如果有空的话我尝试一下这个方案:http://www.jianshu.com/p/9165249da2fa

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文