Проблемы LayoutManager и RecyclerView при создании RecyclerView для фрагмента - PullRequest
0 голосов
/ 20 декабря 2018

Краткое примечание: я не очень разбираюсь в java или android studio, поэтому, пожалуйста, не обращайте внимания на мой нубистский вопрос.

Я работаю над проектом, в котором есть фрагмент с цветами RAL.Всего чуть более 280 изображений.Я пытаюсь создать recyclerView для этого фрагмента.Чтобы этот вопрос не был длиннее, чем он есть, я вырезал некоторые цвета в фрагменте.

Я хочу, чтобы расположение цветов было таким:

image1  image2  image3

image4  image5  image6

...

image280 image281

(The last line only has 2 images.)

Я просмотрел несколько учебных пособий (ни один из них не работал с rv во фрагментах) и попытался реализовать то, что они сделали, в моем проекте, но я получаю следующую ошибку:

    java.lang.IllegalStateException: RecyclerView has no LayoutManager android.support.v7.widget.RecyclerView{ab3c28d VFED.... ......I. 0,0-0,0 #7f0800a2 app:id/recyclerView}, adapter:null, layout:null, context:com.westcoastpowdercoating.WestCoastPowderCoating.MainActivity@3b25cc8b
    at android.support.v7.widget.RecyclerView.generateLayoutParams(RecyclerView.java:4304)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:808)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:809)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:504)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:414)
    at com.westcoastpowdercoating.WestCoastPowderCoating.ralfragment.onCreateView(ralfragment.java:23)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2439)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1460)
    at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1784)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1852)
    at android.support.v4.app.BackStackRecord.executeOps(BackStackRecord.java:802)
    at android.support.v4.app.FragmentManagerImpl.executeOps(FragmentManager.java:2625)
    at android.support.v4.app.FragmentManagerImpl.executeOpsTogether(FragmentManager.java:2411)
    at android.support.v4.app.FragmentManagerImpl.removeRedundantOperationsAndExecute(FragmentManager.java:2366)
    at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:2273)
    at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:733)
    at android.os.Handler.handleCallback(Handler.java:739)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:135)
    at android.app.ActivityThread.main(ActivityThread.java:5254)
    at java.lang.reflect.Method.invoke(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

Гаданиеиз-за этой ошибки менеджер компоновки или просмотрщик не подключается.Я не уверен, где я ошибся.Должен ли я сделать что-то в моем MainActivity.java?В уроке, который я наблюдал, они сделали большую часть того, что у меня есть в моем ralfragment.java, в их файле MainActivity.java, но я подумал, что мне нужно будет переместить его в мой ralfragment.java, потому что это фрагмент, для которого мне нужен recycvlerView.

Это мой ralfragment.java:

    public class ralfragment extends Fragment {
private RecyclerView mRecyclerView;
private RecyclerView.Adapter mAdapter;
private RecyclerView.LayoutManager mLayoutManager;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_ral, container, false);

    ArrayList<ralcolor> ralcolors= new ArrayList<>();
    ralcolors.add(new ralcolor(R.drawable.ral1000, R.drawable.ral1001, R.drawable.ral1002));
    ralcolors.add(new ralcolor(R.drawable.ral1003, R.drawable.ral1004, R.drawable.ral1005));
    ralcolors.add(new ralcolor(R.drawable.ral1006, R.drawable.ral1007, R.drawable.ral1011));

    ralcolors.add(new ralcolor(R.drawable.ral1012, R.drawable.ral1013, R.drawable.ral1014));
    ralcolors.add(new ralcolor(R.drawable.ral1015, R.drawable.ral1016, R.drawable.ral1017));
    ralcolors.add(new ralcolor(R.drawable.ral1018, R.drawable.ral1019, R.drawable.ral1020));


    mRecyclerView = view.findViewById(R.id.recyclerView);
    mRecyclerView.setHasFixedSize(true);
    mLayoutManager = new LinearLayoutManager(getActivity());
    mAdapter =  new Adapter(ralcolors);

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.setAdapter(mAdapter);

    return view;
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}
}

Мой адаптер:

public class Adapter extends RecyclerView.Adapter<Adapter.viewHolder> {
private ArrayList<ralcolor> mralcolors;

public static class viewHolder extends RecyclerView.ViewHolder {
    public ImageView mImageView1;
    public ImageView mImageView2;
    public ImageView mImageView3;

    public viewHolder(View itemView) {
        super(itemView);
        mImageView1 = itemView.findViewById(R.id.imageView1000);
        mImageView2 = itemView.findViewById(R.id.imageView1001);
        mImageView3 = itemView.findViewById(R.id.imageView1002);
    }
}

public Adapter(ArrayList<ralcolor> ralcolors) {
    mralcolors  = ralcolors;
}

@NonNull
@Override
public viewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.fragment_ral, viewGroup, false);
    viewHolder vh = new viewHolder(v);
    return vh;
}

@Override
public void onBindViewHolder(@NonNull viewHolder viewHolder, int i) {
ralcolor currentcolor = mralcolors.get(i);

    viewHolder.mImageView1.setImageResource(currentcolor.getmImageResource1());
    viewHolder.mImageView2.setImageResource(currentcolor.getmImageResource2());
    viewHolder.mImageView3.setImageResource(currentcolor.getmImageResource3());
}

@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
    super.onAttachedToRecyclerView(recyclerView);
}


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

Мой RAL xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="match_parent"
android:layout_width="match_parent">

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

    <LinearLayout
        android:layout_height="wrap_content"
        android:layout_width="match_parent"
        android:orientation="vertical"
        android:paddingLeft="16dp"
        android:paddingRight="16dp">

        <LinearLayout
            android:layout_gravity="center_horizontal"
            android:layout_height="match_parent"
            android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:paddingTop="5dp">

            <ImageView
                android:id="@+id/imageView1000"
                android:layout_height="100dp"
                android:layout_width="100dp" />

            <ImageView
                android:id="@+id/imageView1001"
                android:layout_height="100dp"
                android:layout_width="100dp" />

            <ImageView
                android:id="@+id/imageView1002"
                android:layout_height="100dp"
                android:layout_width="100dp" />
        </LinearLayout>
    </LinearLayout>

</android.support.v7.widget.RecyclerView>
</RelativeLayout>

Мой инструмент получения цвета ralJava:

    package com.westcoastpowdercoating.WestCoastPowderCoating;

public class ralcolor {
private int mImageResource1;
private int mImageResource2;
private int mImageResource3;

public ralcolor(int imageResource1, int imageResource2, int 
imageResource3) {
    mImageResource1 = imageResource1;
    mImageResource2 = imageResource2;
    mImageResource3 = imageResource3;
}

public int getmImageResource1() {
    return mImageResource1;
}

public int getmImageResource2() {
    return mImageResource2;
}

public int getmImageResource3() {
    return mImageResource3;
}

}

Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Нельзя помещать детей в RecyclerView в XML.Похоже, что у вас там есть то, что вы хотите быть в вашем ViewHolder.Это не то, как это сделать.

Создайте новый XML-файл макета и переместите в него тот файл, который находится в вашем RecyclerView.

Затем измените аргумент inflate() внутри onCreateViewHolder(), чтобы использоватьправильное расположение (изменить R.layout.fragment_ral).

0 голосов
/ 20 декабря 2018
  • Причиной является LayoutManager из реселлера.
  • Компоновщик имеет 3 подкласса: LinearLayoutManager, GridLayoutManager и StaggeredGridLayoutManager.
  • Вы можете попробовать LinearLayoutManager с recyclerview
  • Надеюсь, вы сможете решить свою проблему.И вы можете сослаться ссылку .Удачи!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...