RecyclerView不会产生列表时,它有它上面的观点 [英] RecyclerView not generating list when it has a view above it

查看:205
本文介绍了RecyclerView不会产生列表时,它有它上面的观点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以,我不能让RecyclerView生成定列表,一旦我把它上面的另一种观点。它和回收视图上面的观点都是一个的LinearLayout内这是一个NestedScrollView的独生子女(用于折叠工具栏)。一旦RecyclerView是在片段一切只能查看按预期工作。

StocksCompleteListFragment.java

 公共类StocksCompleteListFragment扩展片段{    @Nullable
    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,捆绑savedInstanceState){
        NestedScrollView SV =(NestedScrollView)inflater.inflate(
                R.layout.fragment_stocks_completelist,集装箱,FALSE);
        的LinearLayout MYLINEAR =(的LinearLayout)sv.findViewById(R.id.mainLinear);
        RecyclerView RV =(RecyclerView)mylinear.findViewById(R.id.recyclerview);
        如果(RV == NULL){
            Toast.makeText(getActivity(),空,Toast.LENGTH_SHORT).show();
        }
        SETU precyclerView(RV);
        返回SV;
    }    私人无效SETU precyclerView(RecyclerView recyclerView){
        recyclerView.setLayoutManager(新LinearLayoutManager(recyclerView.getContext()));
        recyclerView.setAdapter(新SimpleStringRecyclerViewAdapter(getActivity(),
                getRandomSublist(Cheeses.sCheeseStrings,30)));
    }    私人列表<串GT; getRandomSublist(String []数组,INT量){
        ArrayList的<串GT;名单=新的ArrayList<>(量);
        随机随机=新的随机();
        而(则为list.size()&下;量){
            list.add(数组[random.nextInt(array.length)]);
        }
        返回列表;
    }    公共静态类SimpleStringRecyclerViewAdapter
            扩展RecyclerView.Adapter< SimpleStringRecyclerViewAdapter.ViewHolder> {        私人最终的TypedValue mTypedValue =新的TypedValue();
        私人诠释mBackground;
        私人列表<串GT; mValues​​;        公共静态类ViewHolder扩展RecyclerView.ViewHolder {
            公共字符串mBoundString;            公众最终视图MView的;
            公众最终ImageView的mImageView;
            公众最终的TextView mTextView;            公共ViewHolder(查看视图){
                超(视图);
                MVIEW =视图。
                mImageView =(ImageView的)view.findViewById(R.id.avatar);
                mTextView =(TextView中)view.findViewById(android.R.id.text1);
            }            @覆盖
            公共字符串的toString(){
                返回super.toString调用()+'+ mTextView.getText();
            }
        }        公共字符串getValueAt(INT位置){
            返回mValues​​.get(位置);
        }        公共SimpleStringRecyclerViewAdapter(上下文的背景下,列表与LT;弦乐>项目){
            。context.getTheme()resolveAttribute(R.attr.selectableItemBackground,mTypedValue,真正的);
            mBackground = mTypedValue.resourceId;
            mValues​​ =物品;
        }        @覆盖
        公共ViewHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){
            查看查看= LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item,父母,假);
            view.setBackgroundResource(mBackground);
            返回新ViewHolder(视图);
        }        @覆盖
        公共无效onBindViewHolder(最终ViewHolder持有人,INT位置){
            holder.mBoundString = mValues​​.get(位置);
            holder.mTextView.setText(mValues​​.get(位置));            holder.mView.setOnClickListener(新View.OnClickListener(){
                @覆盖
                公共无效的onClick(视图v){
                    上下文的背景下= v.getContext();
                    意向意图=新意图(背景下,CheeseDetailActivity.class);
                    intent.putExtra(CheeseDetailActivity.EXTRA_NAME,holder.mBoundString);                    context.startActivity(意向);
                }
            });            Glide.with(holder.mImageView.getContext())
                    .load(Cheeses.getRandomCheeseDrawable())
                    .fitCenter()
                    .into(holder.mImageView);
        }        @覆盖
        公众诠释getItemCount(){
            返回mValues​​.size();
        }
    }
}

和这里的布局XML fragment_stocks_completelist.xml:

 <?XML版本=1.0编码=UTF-8&GT?;
< android.support.v4.widget.NestedScrollView
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:程序=htt​​p://schemas.android.com/apk/res-auto
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    应用:layout_behavior =@字符串/ appbar_scrolling_view_behavior>    <的LinearLayout
        机器人:ID =@ + ID / mainLinear
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent
        机器人:方向=垂直>        <的LinearLayout
            机器人:ID =@ + ID / progressBarLayout
            机器人:layout_width =match_parent
            机器人:layout_height =WRAP_CONTENT
            机器人:layout_gravity =center_vertical
            机器人:layout_marginBottom =4DP
            机器人:layout_marginTop =8DP
            机器人:背景=@彩色/ grayBackground
            机器人:重力=center_vertical | CENTER_HORIZONTAL
            机器人:填充=4DP
            机器人:知名度=水涨船高>            <进度
                机器人:ID =@ + ID / progressBar1
                风格=机器人:ATTR / progressBarStyle
                机器人:layout_width =WRAP_CONTENT
                机器人:layout_height =WRAP_CONTENT/>        < / LinearLayout中>        < android.support.v7.widget.RecyclerView
            机器人:ID =@ + ID / recyclerview
            机器人:layout_width =match_parent
            机器人:layout_height =WRAP_CONTENT/>    < / LinearLayout中>< /android.support.v4.widget.NestedScrollView>


解决方案

您需要设置

 的android:fillViewport =真

您NestedRecyclerView。如果你把它放到 CoordinatorLayout 则还可以指定行为(你已经做了)

So I cannot make the RecyclerView generate the given list once I have another view above it. The view above it and the recycler view are both within a LinearLayout and which is the single child of a NestedScrollView (used for collapsing the toolbar). Once RecyclerView is the only view in the fragment everything works as expected.

StocksCompleteListFragment.java

public class StocksCompleteListFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        NestedScrollView sv = (NestedScrollView) inflater.inflate(
                R.layout.fragment_stocks_completelist, container, false);
        LinearLayout mylinear = (LinearLayout) sv.findViewById(R.id.mainLinear);
        RecyclerView rv = (RecyclerView) mylinear.findViewById(R.id.recyclerview);
        if (rv == null){
            Toast.makeText(getActivity(),"Null", Toast.LENGTH_SHORT).show();
        }
        setupRecyclerView(rv);
        return sv;
    }

    private void setupRecyclerView(RecyclerView recyclerView) {
        recyclerView.setLayoutManager(new LinearLayoutManager(recyclerView.getContext()));
        recyclerView.setAdapter(new SimpleStringRecyclerViewAdapter(getActivity(),
                getRandomSublist(Cheeses.sCheeseStrings, 30)));
    }

    private List<String> getRandomSublist(String[] array, int amount) {
        ArrayList<String> list = new ArrayList<>(amount);
        Random random = new Random();
        while (list.size() < amount) {
            list.add(array[random.nextInt(array.length)]);
        }
        return list;
    }

    public static class SimpleStringRecyclerViewAdapter
            extends RecyclerView.Adapter<SimpleStringRecyclerViewAdapter.ViewHolder> {

        private final TypedValue mTypedValue = new TypedValue();
        private int mBackground;
        private List<String> mValues;

        public static class ViewHolder extends RecyclerView.ViewHolder {
            public String mBoundString;

            public final View mView;
            public final ImageView mImageView;
            public final TextView mTextView;

            public ViewHolder(View view) {
                super(view);
                mView = view;
                mImageView = (ImageView) view.findViewById(R.id.avatar);
                mTextView = (TextView) view.findViewById(android.R.id.text1);
            }

            @Override
            public String toString() {
                return super.toString() + " '" + mTextView.getText();
            }
        }

        public String getValueAt(int position) {
            return mValues.get(position);
        }

        public SimpleStringRecyclerViewAdapter(Context context, List<String> items) {
            context.getTheme().resolveAttribute(R.attr.selectableItemBackground, mTypedValue, true);
            mBackground = mTypedValue.resourceId;
            mValues = items;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.list_item, parent, false);
            view.setBackgroundResource(mBackground);
            return new ViewHolder(view);
        }

        @Override
        public void onBindViewHolder(final ViewHolder holder, int position) {
            holder.mBoundString = mValues.get(position);
            holder.mTextView.setText(mValues.get(position));

            holder.mView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    Context context = v.getContext();
                    Intent intent = new Intent(context, CheeseDetailActivity.class);
                    intent.putExtra(CheeseDetailActivity.EXTRA_NAME, holder.mBoundString);

                    context.startActivity(intent);
                }
            });

            Glide.with(holder.mImageView.getContext())
                    .load(Cheeses.getRandomCheeseDrawable())
                    .fitCenter()
                    .into(holder.mImageView);
        }

        @Override
        public int getItemCount() {
            return mValues.size();
        }
    }
}

And here's the layout xml fragment_stocks_completelist.xml:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.NestedScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <LinearLayout
        android:id="@+id/mainLinear"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <LinearLayout
            android:id="@+id/progressBarLayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center_vertical"
            android:layout_marginBottom="4dp"
            android:layout_marginTop="8dp"
            android:background="@color/grayBackground"
            android:gravity="center_vertical|center_horizontal"
            android:padding="4dp"
            android:visibility="gone">

            <ProgressBar
                android:id="@+id/progressBar1"
                style="?android:attr/progressBarStyle"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content" />

        </LinearLayout>

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerview"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </LinearLayout>

</android.support.v4.widget.NestedScrollView>

解决方案

You need to set

    android:fillViewport="true"

on your NestedRecyclerView. If you put it into the CoordinatorLayout then also specify the behavior (which you've already done)

这篇关于RecyclerView不会产生列表时,它有它上面的观点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆