首页 > 解决方案 > LinearLayout 中的第三个 RecyclerView 不会显示

问题描述

我在 LinearLayout 中有 3 个 RecyclerViews。我的目标是按顺序显示所有这些,因此第一个 RecyclerView 在顶部,第二个 RecyclerView 在中间,第三个 RecyclerView 在底部。但是第三个 RecyclerView 没有出现在屏幕上。在下面你可以看到我的文件:

// GroupsScreenActivity.java
public class GroupsScreenActivity extends AppCompatActivity {

    private RecyclerView recyclerViewGoldenGroup;
    private RecyclerView recyclerViewSilverGroup;
    private RecyclerView recyclerViewBronceGroup;

    private GoldenRecyclerViewAdapter goldenGroupRecyclerViewAdapter;
    private SilverGroupRecyclerViewAdapter silverGroupRecyclerViewAdapter;
    private BronceRecyclerViewAdapter bronceGroupRecyclerViewAdapter;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_groups_screen);

        // get a reference to the golden recyclerView
        recyclerViewGoldenGroup = (RecyclerView) findViewById(R.id.rvGoldenGroup);

        // create the adapter
        goldenGroupRecyclerViewAdapter = new GoldenRecyclerViewAdapter(getSampleArrayList());

        // create the LinearLayoutManager
        LinearLayoutManager goldenLayoutManager =  new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);

        // set the LayoutManager
        recyclerViewGoldenGroup.setLayoutManager(goldenLayoutManager);

        // set the adapter
        recyclerViewGoldenGroup.setAdapter(goldenGroupRecyclerViewAdapter);
        ///////////////////////////////////////////////////////////////////////////////////////
        ///////////////////////////////////////////////////////////////////////////////////////

        // get a reference to the silver RecyclerView
        recyclerViewSilverGroup = (RecyclerView) findViewById(R.id.rvSilverGroup);

        // create the adapter
        silverGroupRecyclerViewAdapter = new SilverGroupRecyclerViewAdapter(getSampleArrayList());

        // create the LinearLayoutManager
        LinearLayoutManager silverLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);

        // set the LayoutManager
        recyclerViewSilverGroup.setLayoutManager(silverLayoutManager);

        // set the adapter
        recyclerViewSilverGroup.setAdapter(silverGroupRecyclerViewAdapter);
        ////////////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////////////

        // get the reference to the bronce RecyclerView
        recyclerViewBronceGroup = (RecyclerView) findViewById(R.id.rvBronceGroup);

        // create the adapter
        bronceGroupRecyclerViewAdapter = new BronceRecyclerViewAdapter(getSampleArrayList());

        // create the LayoutManager
        LinearLayoutManager bronceLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);

        // set the LayoutManager
        recyclerViewBronceGroup.setLayoutManager(bronceLayoutManager);

        // set the adapter
        recyclerViewSilverGroup.setAdapter(bronceGroupRecyclerViewAdapter);

    }

    private ArrayList<Object> getSampleArrayList() {
        ArrayList<Object> items = new ArrayList<>();
        items.add(new User("Dany Targaryen", "Valyria"));
        items.add(new User("Rob Stark", "Winterfell"));
        items.add("image");
        items.add(new User("Jon Snow", "Castle Black"));
        items.add("image");
        items.add(new User("Tyrion Lanister", "King's Landing"));
        return items;
    }
}

在下面,您可以看到布局文件。这包括一个带有垂直 LinearLayout 的 ConstraintLayout,它有 3 个 RecyclerViews 作为其子项:

<android.support.constraint.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".GroupsScreen">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rvGoldenGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rvSilverGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/rvBronceGroup"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    </LinearLayout>
</android.support.constraint.ConstraintLayout>

为简洁起见,我只添加了顶层 RecyclerView 的 RecyclerView.Adapter 子类。其他两个是一样的:

public class GoldenRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    // The items to display in your RecyclerView
    private List<Object> items;

    private final int USER = 0, IMAGE = 1;

    // Provide a suitable constructor (depends on the kind of dataset)
    public GoldenRecyclerViewAdapter(List<Object> items) {
        this.items = items;
    }

    // Return the size of your dataset (invoked by the layout manager)
    @Override
    public int getItemCount() {
        return this.items.size();
    }

    // we need to override this method to tell the
    // "RecyclerView" about the type of view to inflate
    // based on the position
    // we'll return USER or IMAGE based on the type object
    // in the data we have
    @Override
    public int getItemViewType(int position) {

        if(items.get(position) instanceof User){
            return USER;
        }
        else if(items.get(position) instanceof String){
            return IMAGE;
        }

        return -1;
    }

    // we need to override this method
    // to tell the "RecyclerView.Adapter" about which "RecyclerView.ViewHolder"
    // object to create based on the "viewType" returned
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        RecyclerView.ViewHolder viewHolder;

        LayoutInflater inflater = LayoutInflater
                .from(viewGroup.getContext());

        switch (viewType){
            case USER:
                View v1 = inflater.inflate(
                        R.layout.layout_viewholder1,
                        viewGroup,
                        false);
                viewHolder = new ViewHolder1(v1);
                break;
            case IMAGE:
                View v2 = inflater.inflate(
                        R.layout.layout_viewholder2,
                        viewGroup,
                        false);
                viewHolder = new ViewHolder2(v2);
                break;
            default:
                View view = inflater.inflate(
                        android.R.layout.simple_list_item_1,
                        viewGroup,
                        false);
                viewHolder = new RecyclerViewSimpleTextViewHolder(view);
                break;

        }
        return viewHolder;
    }

    // we override this method
    // to configure the "ViewHolder" with actual data that needs to be
    // displayed
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) {

        switch (viewHolder.getItemViewType()) {
            case USER:
                ViewHolder1 vh1 = (ViewHolder1) viewHolder;
                configureViewHolder1(vh1, position);
                break;
            case IMAGE:
                ViewHolder2 vh2 = (ViewHolder2) viewHolder;
                configureViewHolder2(vh2);
                break;

            default:
                RecyclerViewSimpleTextViewHolder vh = (RecyclerViewSimpleTextViewHolder) viewHolder;
                configureDefaultViewHolder(vh, position);
                break;

        }
    }

    private void configureDefaultViewHolder(RecyclerViewSimpleTextViewHolder vh, int position) {
        vh.getTv().setText((CharSequence) items.get(position));
    }


    private void configureViewHolder1(ViewHolder1 vh1, int position) {
        User user = (User) items.get(position);
        if (user != null) {
            vh1.getLabel1().setText("Name: " + user.getName());
            vh1.getLabel2().setText("Hometown: " + user.getHomeTown());
        }
    }

    private void configureViewHolder2(ViewHolder2 vh2) {
        vh2.getIvExample().setImageResource(R.drawable.ic_launcher_background);
    }


}

我希望有人能帮忙。这就是它的样子。如您所见,屏幕上仅显示第一个和第二个 RecylerView。在此处输入图像描述

标签: androidandroid-recyclerviewandroid-linearlayout

解决方案


您在此将 BronceAdapter 设置为 SilverRecyclerView

recyclerViewSilverGroup.setAdapter(bronceGroupRecyclerViewAdapter);

更换RecyclerView为青铜的,应该可以工作。

希望能帮助到你。


推荐阅读