1c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev/*
2c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * Copyright (C) 2015 The Android Open Source Project
3c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev *
4c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * Licensed under the Apache License, Version 2.0 (the "License");
5c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * you may not use this file except in compliance with the License.
6c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * You may obtain a copy of the License at
7c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev *
8c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev *      http://www.apache.org/licenses/LICENSE-2.0
9c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev *
10c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * Unless required by applicable law or agreed to in writing, software
11c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * distributed under the License is distributed on an "AS IS" BASIS,
12c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * See the License for the specific language governing permissions and
14c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * limitations under the License.
15c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev */
16c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
17c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
18c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevpackage com.example.android.supportv7.widget;
19c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
20c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevimport android.app.Activity;
21c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevimport android.content.Context;
22c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevimport android.os.Bundle;
23c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevimport android.view.Menu;
24c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevimport android.view.MenuItem;
25c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevimport android.view.ViewGroup;
26c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevimport android.widget.TextView;
27c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
28def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.recyclerview.widget.AsyncListUtil;
29def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.recyclerview.widget.LinearLayoutManager;
30def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikasimport androidx.recyclerview.widget.RecyclerView;
31def582a5836579a3fadabfdbe4413cb1652bf098Aurimas Liutikas
32458543f38db49fdcb1764f007ded33820964c3feAurimas Liutikasimport com.example.android.supportv7.Cheeses;
33458543f38db49fdcb1764f007ded33820964c3feAurimas Liutikas
34c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev/**
35c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev * A sample Activity to demonstrate capabilities of {@link AsyncListUtil}.
36c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev */
37c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheevpublic class AsyncListUtilActivity extends Activity {
38c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
39c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    private static final String TAG = "AsyncListUtilActivity";
40c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
41c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    private RecyclerView mRecyclerView;
42c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
43c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    private LinearLayoutManager mLinearLayoutManager;
44c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
45c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    @Override
46c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    protected void onCreate(Bundle savedInstanceState) {
47c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        super.onCreate(savedInstanceState);
48c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
49c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        mRecyclerView = new RecyclerView(this);
50c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        mLinearLayoutManager = new LinearLayoutManager(this);
51c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        mRecyclerView.setLayoutManager(mLinearLayoutManager);
52c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        mRecyclerView.setHasFixedSize(true);
53c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        final ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(
54c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
55c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        mRecyclerView.setLayoutParams(layoutParams);
56c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        mRecyclerView.setAdapter(new AsyncAdapter());
57c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        setContentView(mRecyclerView);
58c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    }
59c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
60c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    @Override
61c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    public boolean onCreateOptionsMenu(Menu menu) {
62c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        super.onCreateOptionsMenu(menu);
63458543f38db49fdcb1764f007ded33820964c3feAurimas Liutikas        menu.add("Layout").setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM);
64c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        return true;
65c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    }
66c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
67c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    @Override
68c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    public boolean onOptionsItemSelected(MenuItem item) {
69c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        mRecyclerView.requestLayout();
70c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        return super.onOptionsItemSelected(item);
71c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    }
72c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
73c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    private static class TextViewHolder extends RecyclerView.ViewHolder {
74c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        TextView textView;
75c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        public TextViewHolder(Context context) {
76c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            super(new TextView(context));
77c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            textView = (TextView) itemView;
78c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        }
79c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    }
80c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
81c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    private class AsyncAdapter extends RecyclerView.Adapter<TextViewHolder> {
82c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
83c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        private AsyncListUtil<String> mAsyncListUtil;
84c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
85c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        AsyncAdapter() {
86c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            mAsyncListUtil = new AsyncStringListUtil();
87c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        }
88c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
89c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        @Override
90c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        public TextViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
91c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            return new TextViewHolder(parent.getContext());
92c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        }
93c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
94c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        @Override
95c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        public void onBindViewHolder(TextViewHolder holder, int position) {
96c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            final String itemString = mAsyncListUtil.getItem(position);
97c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            if (itemString == null) {
98c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                holder.textView.setText("loading...");
99c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            } else {
100c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                holder.textView.setText(itemString);
101c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            }
102c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        }
103c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
104c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        @Override
105c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        public int getItemCount() {
106c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            return mAsyncListUtil.getItemCount();
107c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        }
108c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    }
109c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
110c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    private class AsyncStringListUtil extends AsyncListUtil<String> {
111c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
112c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        private static final int TILE_SIZE = 5;
113c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
114c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        private static final long DELAY_MS = 500;
115c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
116c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        public AsyncStringListUtil() {
117c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            super(String.class, TILE_SIZE,
118c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                    new AsyncListUtil.DataCallback<String>() {
119c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        @Override
120c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        public int refreshData() {
121c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            return Cheeses.sCheeseStrings.length;
122c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        }
123c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
124c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        @Override
125c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        public void fillData(String[] data, int startPosition, int itemCount) {
126c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            sleep();
127c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            for (int i = 0; i < itemCount; i++) {
128c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                                data[i] = Cheeses.sCheeseStrings[startPosition + i];
129c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            }
130c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        }
131c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
132c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        private void sleep() {
133c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            try {
134c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                                Thread.sleep(DELAY_MS);
135c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            } catch (InterruptedException e) {
136c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                                e.printStackTrace();
137c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            }
138c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        }
139c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                    },
140c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                    new AsyncListUtil.ViewCallback() {
141c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        @Override
142c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        public void getItemRangeInto(int[] outRange) {
143c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            outRange[0] = mLinearLayoutManager.findFirstVisibleItemPosition();
144c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            outRange[1] = mLinearLayoutManager.findLastVisibleItemPosition();
145c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        }
146c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
147c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        @Override
148c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        public void onDataRefresh() {
149c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            mRecyclerView.getAdapter().notifyDataSetChanged();
150c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        }
151c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
152c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        @Override
153c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        public void onItemLoaded(int position) {
154c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                            mRecyclerView.getAdapter().notifyItemChanged(position);
155c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                        }
156c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                    });
157c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev
158c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            mRecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
159c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                @Override
160c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
161c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                    onRangeChanged();
162c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev                }
163c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev            });
164c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev        }
165c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev    }
166c0b309e1eaafe556c66e77818946d986c66a8bc5Vladislav Kaznacheev}
167