Третий RecyclerView в LinearLayout не будет показан - PullRequest
0 голосов
/ 19 октября 2018

У меня есть 3 RecyclerViews в LinearLayout.Моя цель - показать их все последовательно, поэтому 1-й RecylerView находится сверху, 2-й RecyclerView находится посередине, а 3-й RecyclerView находится снизу.Но 3-й 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;
    }
}

В следующем вы можете увидеть файл макета.Он состоит из ConstraintLayout с вертикальным LinearLayout, который имеет 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.Adapter верхнего RecyclerView.Два других просто одинаковы:

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);
    }


}

Я надеюсь, что кто-нибудь может помочь.Вот как это выглядит.Как видите, только 1-й и 2-й RecylerView отображаются на экране.enter image description here

Ответы [ 2 ]

0 голосов
/ 19 октября 2018

Заменить следующую часть макета

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:weightSum="3"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvGoldenGroup"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="0dp"/>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvSilverGroup"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="0dp" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvBronceGroup"
        android:layout_width="match_parent"
        android:layout_weight="1"
        android:layout_height="0dp" />
</LinearLayout>
0 голосов
/ 19 октября 2018

Вы установите BronceAdapter для SilverRecyclerView в этом

recyclerViewSilverGroup.setAdapter(bronceGroupRecyclerViewAdapter);

Замените RecyclerView на Бронзовый и должен работать.

Надеюсь, это поможет.

...