当前位置: 首页 > 知识库问答 >
问题:

为片段创建RecyclerView时LayoutManager和RecyclerView问题

翁钧
2023-03-14

简要说明:我对java或android studio不是很有经验,所以请直接回答我的noobish问题。

我正在做一个有RAL颜色片段的项目。总共只有280多张图片。我正在尝试为此片段创建一个recyclerView。为了避免这个问题比实际问题长出几英里,我删去了ralfragment中的一些颜色。

我希望颜色的布局如下所示:

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)

根据此错误推测,layoutmanager或RecycleServicewer未连接。我不知道我哪里出错了。我需要在我的主要活动中做点什么吗。Java语言在我观看的教程中,他们充分利用了我的ralfragment。java在其主要活动中。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();
}
}

我的AL 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>

我的ral颜色检索器java:

    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个答案

申屠喜
2023-03-14
  • 原因是recyclerview的LayoutManager
胡俊弼
2023-03-14

不能在XML中的RecyclerView中放置子项。看起来您当前拥有的内容就是您希望在ViewHolder中拥有的内容。这不是怎么做的。

创建一个新的布局XML文件,并将包装在RecyclerView中的内容移动到该文件中。

然后更改onCreateViewHolder()中的参数以使用正确的布局(更改R.layout.fragment\ral)。

 类似资料:
  • 创建一个 RecyclerView LayoutManager – Part 1 原文链接 : Building a RecyclerView LayoutManager – Part 1 原文作者 : Dave Smith 译文出自 : 开发技术前线 www.devtf.cn 译者 : tiiime 校对者: chaossss 状态 : 完成 本文是这个系列中的 Part 1,这里是 Part

  • 嗨,我在新的上遇到了一个问题

  • 我有方法: 将图像添加到我的recyclerview。如果它在活动中,我会在OnCreate中调用initImageBitmaps()。不幸的是,我必须在片段中使用它,问题是:如何将这些方法实现到扩展片段的类?当然,所有内容都将显示在RecyclerView中,并带有xml中的recycler\u视图id。 编辑:我的适配器: 它仅在注释mContext=context时编译 在适配器中。那么错误

  • 我们从REST API获取到数据后,我们需要把它绑定View上,并用一个适配器填充列表。我们的RecyclerView适配器是标准的。它继承于RecyclerView.Adapter并指定它自己的ViewHolder: public static class ViewHolder extends RecyclerView.ViewHolder { @InjectView(R.id.name

  • 我正在参加在线android工作室课程,我坚持这项任务。 将RecyclerView的layoutManager属性更改为GridLayoutManager https://github.com/google-developer-training/android-basics-kotlin-affirmations-app-solution

  • 如何创建一个选项菜单,如以下屏幕截图: 点击RecyclerView项目的“更多”图标后,应打开选项菜单! 我的尝试是这样的: 但这会导致问题,因为如果我点击RecyclerView item More按钮,则会单击完整项目。。。 这是我的RecyclerViewOnTouchListener: 我没有发现任何类似的问题,所以我希望你能帮助我!