【问题标题】:recyclerview in view pager won't load视图寻呼机中的 recyclerview 不会加载
【发布时间】:2018-03-10 08:44:11
【问题描述】:

我正在使用 viewpager 开发一个带有多个选项卡的 android 应用程序。但是,包含 recyclerview 的选项卡之一只是不停地加载,如随附的屏幕截图所示。 recyclerview 包含图像列表。我可以在其他选项卡中成功加载 imageview 和 textview,只有这个包含 recyclerview 的选项卡有问题。

适配器:

 public class MasterListAdapter extends RecyclerView.Adapter<MasterListAdapter.Holder> {
    private Context mContext;
    private List<Integer> mImageIds;
    private LayoutInflater inflater;

    @BindView(R.id.images_list_view) ImageView imageView;

    public MasterListAdapter(Context context, List<Integer> imageIds) {
        mContext = context;
        mImageIds = imageIds;
        inflater = LayoutInflater.from(context);
    }

    @Override
    public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
        return new Holder(inflater.inflate(R.layout.list_view, parent, false));
    }

    @Override
    public void onBindViewHolder(Holder holder, int position) {
        Glide.with(mContext).load(mImageIds.get(position)).apply(RequestOptions.fitCenterTransform()).into(imageView);
    }

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

    public class Holder extends ViewHolder {

        public Holder(View itemView) {
            super(itemView);

        }
    }
}

片段:

    public class ListFragment extends BaseFragment {
    @BindView(R.id.recyclerView)
    RecyclerView recyclerView;

    @Override
    int getLayoutId() {
        return R.layout.fragment_list;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) 
{
        super.onViewCreated(view, savedInstanceState);
        init();
    }

    private void init() {
        recyclerView.setAdapter(new MasterListAdapter(getContext(),ImageAssets.getImages()));
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
    }
}

图像资产:

public class ImageAssets {

private static final List<Integer> images = new ArrayList<Integer>() {{
    add(R.drawable.user);
    //add(R.drawable.img2);
    //add(R.drawable.img3);
    //add(R.drawable.img4);
    //add(R.drawable.img5);
    //add(R.drawable.img6);
    //add(R.drawable.img7);
    //add(R.drawable.img8);
    //add(R.drawable.img9);
    //add(R.drawable.img10);
    //add(R.drawable.img11);
    //add(R.drawable.img12);
    //add(R.drawable.img13);
}};

public static List<Integer> getImages() {
    return images;
}
}

浏览器:

    static class ViewPagerAdapter extends FragmentPagerAdapter {

    ViewPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        return Page.values()[position].getFragment();
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return Page.values()[position].getTitle();
    }

    @Override
    public int getCount() {
        return Page.values().length;
    }
}

enum Page {
    First("View") {
        @Override
        Fragment getFragment() {return new ListFragment();}
    };

    private String title;

    Page(String title) {
        this.title = title;
    }

    String getTitle() {
        return title;
    }

    abstract Fragment getFragment();
}

list_view.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:foreground="?attr/selectableItemBackground"
xmlns:android="http://schemas.android.com/apk/res/android">

<ImageView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/images_list_view"
    android:clipToPadding="false"
    android:src="@drawable/user">

</ImageView>

</android.support.v7.widget.CardView>

更新:

大家好,感谢您对我的帖子的所有有价值的回复。我已经找出了无限加载问题的原因。这是因为我不小心在 MainActivity 中导入了 ListFragment,它与我的片段类的名称完全相同。删除导入解决了这个问题。

【问题讨论】:

  • ImageAssets 是什么? (请发布该代码)
  • 发布了代码。 ImageAssets 将返回可绘制的图像列表。
  • 更新答案请查收

标签: android android-recyclerview android-viewpager android-glide


【解决方案1】:

代替

    @BindView(R.id.images_list_view) ImageView imageView;

试试这个:-

public class Holder extends ViewHolder {
    public ImageView imageView;
    public Holder(View itemView) {
        super(itemView);
       imageView = itemView.findViewById(R.id.images_list_view);
}  

onBind

@Override
public void onBindViewHolder(Holder holder, int position) {     
  Glide.with(mContext)
       .load(mImageIds.get(position))
       .apply(RequestOptions.fitCenterTransform())
       .into(holder.imageView);
}

当您调用静态引用时,您的 ImageAssets 构造函数永远不会被调用.. 所以获取正确的图像列表在您的片段中尝试这个:-

private void init() {
    ImageAssets imageAssets = new ImageAssets(); // add this line to get the images 
    recyclerView.setAdapter(new MasterListAdapter(getContext(),ImageAssets.getImages()));
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}

ImageAssets 类中创建构造函数并在那里初始化images !!

【讨论】:

  • 我以前试过这个。它仍然无法正常工作。加载屏幕出现并永远加载。
  • 刚刚尝试添加构造函数并初始化。还是不行
  • 你能把你的item xml layout 的recyclerView 或者你的list_view.xml@chunwai 发上来
【解决方案2】:

发现你的问题。您忘记在 Holder 类中绑定您的视图。

public class MasterListAdapter extends RecyclerView.Adapter<MasterListAdapter.Holder> {
private Context mContext;
private List<Integer> mImageIds;
private LayoutInflater inflater;



public MasterListAdapter(Context context, List<Integer> imageIds) {
    mContext = context;
    mImageIds = imageIds;
    inflater = LayoutInflater.from(context);
}

@Override
public Holder onCreateViewHolder(ViewGroup parent, int viewType) {
    return new Holder(inflater.inflate(R.layout.list_view, parent, false));
}

@Override
public void onBindViewHolder(Holder holder, int position) {
    Glide.with(mContext).load(mImageIds.get(position)).apply(RequestOptions.fitCenterTransform()).into(holder.imageView);
}

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

public class Holder extends ViewHolder {
    @BindView(R.id.images_list_view) ImageView imageView;
    public Holder(View itemView) {
        super(itemView);
        ButterKnife.bind(this, itemView);
    }
}

}

片段

public class ListFragment extends BaseFragment {
@BindView(R.id.recyclerView)
RecyclerView recyclerView;

@Override
int getLayoutId() {
    return R.layout.fragment_list;
}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) 
{
    super.onViewCreated(view, savedInstanceState);
    ButterKnife.bind(this, view);
    init();
}

private void init() {
    recyclerView.setAdapter(new MasterListAdapter(getContext(),ImageAssets.getImages()));
    recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
}

}

【讨论】:

猜你喜欢
  • 2021-06-18
  • 2018-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多