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