Recyclerview в представлении, пейджер не загружается

Я разрабатываю приложение для Android с несколькими вкладками, используя viewpager. Однако одна из вкладок, содержащих recyclerview, просто продолжает загружаться без остановки, как показано на прилагаемом снимке экрана. В recyclerview содержится список изображений. Я могу успешно загрузить изображение и текст на других вкладках, только эта вкладка, содержащая 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()));
    }
}

ImageAssets:

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

Viewpager:

    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>

Обновлять:

Привет всем, спасибо за все ваши ценные ответы на мой пост. Я выяснил причину проблемы с бесконечной загрузкой. Это произошло потому, что я случайно импортировал ListFragment в MainActivity, имя которого совпадает с именем моего класса фрагмента. Удаление импорта решило проблему.

что такое ImageAssets? (пожалуйста, опубликуйте этот код)

Santanu Sur 10.03.2018 09:49

выложил код. ImageAssets вернет список изображений в формате drawable.

bryccw 10.03.2018 09:52

обновил ответ, пожалуйста, проверьте

Santanu Sur 10.03.2018 09:54
2
3
430
2

Ответы 2

Вместо

    @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 !!

Я пробовал это раньше. Это все еще не работает. Экран загрузки появляется и загружается навсегда.

bryccw 10.03.2018 10:00

просто попытался добавить конструктор и инициализировать. все еще не работает

bryccw 10.03.2018 10:21

Вы можете опубликовать свой item xml layout из recyclerView или свой list_view.xml @chunwai

Santanu Sur 10.03.2018 10:22

Нашел свою проблему. Вы забыли привязать свое представление к классу 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()));
}

}

@chunwai, вы также забыли привязать свой RecyclerView внутри класса ListFragment. Пожалуйста, проверьте обновленный ответ, как привязать вид внутри фрагмента. Кроме того, BaseFragment устарел на уровне API 27.1.0, вместо этого расширяет Fragment или BaseSupportFragment. developer.android.com/reference/android/support/v17/leanback‌ /…

Rafiqul Hasan 10.03.2018 11:32

Другие вопросы по теме