2015-08-19 5 views
0

я читал различные ответы здесь, на StackOverflow и на этом blog post и пытался реализовать свои решения, но я все еще получаю ошибку:RecyclerView: адаптер не прилагается; пропуская макет

RecyclerView﹕ No adapter attached; skipping layout

Так что я инициализирую мой взгляд ресайклера в onCreateView в моем фрагменте как это:

public class ProfileFragment extends Fragment { 

private ModelUser user; 

private View view; 
private RecyclerView gridView; 
private ProfilePhotoRecyclerViewAdapter adapter; 
private List<ModelAttachment> photoList = new ArrayList<ModelAttachment>(); 

public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

    view = inflater.inflate(R.layout.fragment_profile, container, false); 

    initializeRecyclerView(); 

    //Get extra info for user 
    QueryAPI query = new QueryAPI(); 
    query.userExtra(user, new QueryAPI.ApiResponse<ModelUser>() { 
     @Override 
     public void onCompletion(ModelUser result) { 
      user = result; 
       photoList.clear(); 
       photoList.addAll(0,user.getPhotos()); 

       adapter.notifyDataSetChanged(); 

      } 
     }); 

    return view; 

} 

} 

функция initializeRecyclerView:

void initializeRecyclerView() { 
     gridView = (RecyclerView) view.findViewById(R.id.grid_view); 
     StaggeredGridLayoutManager gridLayoutManager = new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.HORIZONTAL); 
     adapter = new ProfilePhotoRecyclerViewAdapter(getActivity(), photoList); 
     gridView.setAdapter(adapter); 
     gridView.setLayoutManager(gridLayoutManager); 
     gridView.setHasFixedSize(true); 
    } 

Раскладка в фрагменте:

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

И расположение пункта:

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

<com.android.volley.toolbox.NetworkImageView 
    android:id="@+id/imageView" 
    android:contentDescription="@string/image_description" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:scaleType="centerCrop" 
    android:adjustViewBounds="true" /> 

</LinearLayout> 

Что я делаю не так?

EDIT: вот адаптер:

public class ProfilePhotoRecyclerViewAdapter extends RecyclerView.Adapter<ProfilePhotoRecyclerViewAdapter.ViewHolder> { 

    private LayoutInflater inflater; 
    private List<ModelAttachment> photos; //data 
    private Activity listContext; 
    private int listRowLayoutId; 
    ImageLoader imageLoader = AppController.getInstance().getImageLoader(); 


    public ProfilePhotoRecyclerViewAdapter(Activity context, List<ModelAttachment> objs) { 
     photos = objs; 
     listContext = context; 
     this.notifyDataSetChanged(); 
    } 

    @Override 
    public ProfilePhotoRecyclerViewAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int i) { 

     View itemView = LayoutInflater.from(listContext).inflate(R.layout.profile_photogrid_item, parent, false); 

     return new ProfilePhotoRecyclerViewAdapter.ViewHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(ProfilePhotoRecyclerViewAdapter.ViewHolder viewHolder, int i) { 

     ModelAttachment photo = photos.get(i); 
     viewHolder.imageView.setImageUrl(photo.getUrl(), imageLoader); 
    } 

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


    public static class ViewHolder extends RecyclerView.ViewHolder { 

     ModelAttachment photo; 
     public NetworkImageView imageView; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      this.imageView = (NetworkImageView) itemView.findViewById(R.id.imageView); 
     } 
    } 
} 

ответ

12

У меня никогда не было этой проблемы, и мне было очень трудно воспроизвести ее.

Это связано с тем, что вы сначала не устанавливаете пустой адаптер для RecyclerView. Блог, который вы даете, точно не рассказал, как это сделать. Вот как я обычно пишу.

Мой конструктор адаптера обычно выглядит так.

public ProfilePhotoRecyclerViewAdapter(Activity context) { 
    photos = new ArrayList<>(); 
    listContext = context; 
} 

И написать публичный метод (setter) для списка массивов объектов.

public void setPhotos(List< ModelAttachment> photoList) { 
    photos.clear(); 
    photos.addAll(photoList); 
    this.notifyItemRangeInserted(0, photos.size() - 1); 
} 

И в вашем фрагменте вам больше не нужно инициализировать с помощью фотоархива.

adapter = new ProfilePhotoRecyclerViewAdapter(getActivity()); 

Просто вызовите метод сеттера из адаптера в методе onCompletion вашего API.

@Override 
public void onCompletion(ModelUser result) { 
    photoList.clear(); 
    photoList.addAll(0,user.getPhotos()); 

    adapter.setPhotos(photoList); 
} 

Я думаю, что это может решить. Не стесняйтесь спрашивать и обсуждать.

Приветствия,

SH

+0

Благодарим за ответ, к сожалению, я попробовал, и я все равно получаю ту же ошибку:/ –

+0

Но теперь я попытался удалить прокруткуview, который я разместил вокруг всего фрагмента, и он работает, у меня все еще есть ошибка, отображаемая в журнале, но Я вижу изображения, я не уверен, почему, хотя ... –

+0

Подождите ... Итак, ваша проблема была не только в том, что журнал ошибок? Можете ли вы опубликовать полный код, как я предложил? –

0

Вы получаете ошибку, потому что вы установите адаптер, если источник данных (photoList) по-прежнему пуст. , а также сказать вашему ресайклеру, что его размер не изменится (вызывается setHasFixedSize (true)), но вы изменяете размер списка в обратном вызове onCompletion запроса. Итак, удалите setHasFixedSize (true), и он должен работать после заполнения списка.

EDIT: Я ошибался, размер в методе не имеет ничего общего с данными, но с размером самого ресайклера.

+1

Я удалил 'setHasFixedSize (правда)', но он по-прежнему дает мне ту же ошибку:/ –

+0

Могли бы вы вставить код адаптера, а? Я считаю само собой разумеющимся, что вы инициализируете photoList где-то перед обратным вызовом? –

+1

Этот ответ неверен. 'setHasFixedSize()' говорит о размере представления каждой строки, а не о количестве элементов, которые имеет адаптер. [Обратитесь к документам] (http://developer.android.com/reference/android/support/v7/widget/RecyclerView.html#setHasFixedSize (boolean)) –

0

убедитесь, что вы установили LayoutManager в RecyclerView.Надеюсь, это поможет :)

LinearLayoutManager llm = new LinearLayoutManager(this); 
llm.setOrientation(LinearLayoutManager.VERTICAL); 
list.setLayoutManager(llm); 
list.setAdapter(adapter);