4

Here is my adapter class

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

    List<CategoryItem> mItems;

    public CategoryAdapter(Context context) {
        super();

        Resources res = context.getResources();
        mItems = new ArrayList<>();

        mItems.add(new CategoryItem(res.getString(R.string.category_book), R.drawable.books));
        // ... few items
        mItems.add(new CategoryItem(res.getString(R.string.category_clothing), R.drawable.clothes));
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext())
                .inflate(R.layout.item_category_selection, viewGroup, false);
        ViewHolder viewHolder = new ViewHolder(v);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {
        CategoryItem category = mItems.get(i);
        viewHolder.title.setText(category.getTitle());
        viewHolder.thumbnail.setImageResource(category.getThumbnail());
    }

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

    class ViewHolder extends RecyclerView.ViewHolder {

        public TextView title;
        public ImageView thumbnail;
        public CardView card;

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

            card = (CardView)itemView.findViewById(R.id.card_view);
            title = (TextView)itemView.findViewById(R.id.category_title);
            thumbnail = (ImageView)itemView.findViewById(R.id.category_thumbnail);
        }
    }
}

My fragment

public class CategorySelectionFragment extends Fragment {

    RecyclerView mRecyclerView;
    RecyclerView.LayoutManager mLayoutManager;
    RecyclerView.Adapter mAdapter;

    public CategorySelectionFragment() {  }

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

        View v = inflater.inflate(R.layout.fragment_category_selection, container, false);

        mRecyclerView = (RecyclerView)v.findViewById(R.id.recycler_view);    
        setUpGrid();

        return v;
    }

    private void setUpGrid() {
        mRecyclerView.setHasFixedSize(true);

    colNum = 3;
        mLayoutManager = new GridLayoutManager(getActivity(), colNum);
        mRecyclerView.setLayoutManager(mLayoutManager);

        mAdapter = new CategoryAdapter(getActivity());
        mRecyclerView.setAdapter(mAdapter);

    }

When fragment just created (onCreateView called) recyclerview works perfectly, but when app goes to background and then restore scroll start to freeze on the first few items and then continue to work smoothly.

When app restore from background onCreateView method is not called so I try to set up adapter for recyclerview in onStart(), like this:

  @Override
    public void onStart(){
        super.onStart();

        // Adapter setting here to avoid freezes, when start to scroll after switching to an app from background.
        mRecyclerView.setAdapter(mAdapter);
    } 

This approach has solved the problem, but it seems like not realy clear way to solve that issue. Since for example, restoring the fragment leads to reset last scrolled position.

Thanks for your help!

Augusent
  • 589
  • 7
  • 10
  • The problem with the recycler view is that it draws and removes indexes as they come on/off screen. This causes problems as not only do you need to keep your data from the adapter but you also need to keep track of the viewable indexes. Pain in the butt! – Nathan Kellert Sep 01 '15 at 21:14
  • 1
    You need to profile and see what is going on. see: http://developer.android.com/tools/help/systrace.html Also, if you are seeing freezes, it is very likely that there is something else doing expensive operations (e.g. disk access) on main thread. Using TraceView may help with that as well. – yigit Sep 02 '15 at 22:49
  • @yigit Thanks for advice! I figured out with my problem, it was just tint property for my card's image, so I removed it and it works well. Looks like traceview is a very useful tool. – Augusent Sep 03 '15 at 14:21

0 Answers0