Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Impossible : No layout manager attached; Skipping layout

Tags:

android

I'm completely lost with this bug, I understand it, but I don't know what's wrong. For the code :

// In the OnCreate of my activity
  historyRecyclerView = (RecyclerView)findViewById(R.id.recycler_suggestions);
  SearchBarHistoryAdapter searchBarHistoryAdapter = new SearchBarHistoryAdapter();
  searchBarHistoryAdapter.setActivity(this);
  historyRecyclerView.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
  historyRecyclerView.setAdapter(searchBarHistoryAdapter);
  searchBarDisplayManager.setTypeAdapter(SearchBarDisplayManager.SEARCH_TYPE.HISTORY, searchBarHistoryAdapter);

The SearchDisplayManager just contains a list of adapters. The adapter :

public class SearchBarHistoryAdapter extends SearchBarAdapter {
private ArrayList<String> historyList;
private HistoryTask historyTask;

private void setHistoryList(ArrayList<String> history) {
historyList = history;
notifyDataSetChanged();
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.search_list_item, parent, false);
final HistoryViewHolder historyViewHolder = new HistoryViewHolder(v);
return historyViewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
  ((HistoryViewHolder) holder).bind(historyList.get(position));
}

@Override
public int getItemCount() {
return historyList == null ? 0 : historyList.size();
}

@Override
public void startSearch(String searchString) {
if(TextUtils.isEmpty(searchString)) {
  if (historyTask != null) {
    historyTask.cancel(true);
  }
  historyTask = new HistoryTask();
  historyTask.execute();
}else{
  setHistoryList(null);
}
}

private class HistoryTask extends AsyncTask<Void, Void, ArrayList<String>> {

@Override
protected ArrayList<String> doInBackground(Void... params) {
  String history = HelperUI.getSearchbarHistory(activity);
  if (!TextUtils.isEmpty(history)) {
    return new ArrayList<>(Arrays.asList(history.split("--")));
  }

  return new ArrayList<>(0);
}

@Override
protected void onPostExecute(ArrayList<String> results) {
  super.onPostExecute(results);
  if (!results.isEmpty()) {
    setHistoryList(results);
  }
  historyTask = null;
}
}

private class HistoryViewHolder extends RecyclerView.ViewHolder {
TextView hint, name;
ImageView img;

public HistoryViewHolder(View v) {
  super(v);
  name = (TextView) v.findViewById(R.id.app_label);
  hint = ((TextView) v.findViewById(R.id.type_label));
  img = ((ImageView) v.findViewById(R.id.item_icon));
}

public void bind(String suggestion) {
  name.setText(Html.fromHtml(suggestion));
  img.setImageDrawable(activity.getResources().getDrawable(R.drawable.ic_public_grey600_48dp));
  img.setTag(suggestion);
}
}
}

Here is the crazy part, when I update the list in setHistoryList, I know the recycler view has the right adapter and it is not null ... but then it kinda loses it, no more adapter in the Recycler view when it tries to update by notifyDatasetChanged() ... it just disappears and, of cours, displays nothing.

Any idea what's wrong ?

like image 559
Valentin Parsy Avatar asked May 04 '16 09:05

Valentin Parsy


1 Answers

You Have to Add a layoutmanager as you regularly do with any Adapter you create for a RecyclerView.

 historyRecyclerView.setLayoutManager(new LinearLayoutManager(context));

Just add this line below of code below setAdpater where you are setting your recycler view with the adpapter.

like image 105
Jai Avatar answered Oct 16 '22 19:10

Jai