Я разрабатываю приложение для 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 вернет список изображений в формате drawable.
обновил ответ, пожалуйста, проверьте
Вместо
@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
Нашел свою проблему. Вы забыли привязать свое представление к классу 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 /…
что такое
ImageAssets? (пожалуйста, опубликуйте этот код)