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

怎么在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内容的动态变化而动态变化的。
但是我现在思路受阻,希望有大神能够指点一下!


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


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

【热门文章】
【热门文章】