Intereting Posts
Добавление автономных объектов в RealmList Как настроить навигационный ящик для открытия справа налево SSLHandshakeException Trust anchor для пути сертификации не найден Android HTTPS Не найден ресурс, который соответствует указанному имени: attr 'android: keyboardNavigationCluster'. При обновлении до Support Library 26.0.0 Явный прозрачный градиент для Android XML Управление сайтом Facebook Facebook Коэффициент масштабирования в изображениях Android? RecyclerView не прокручивается на дно Страница Captive Portal с MITM Не удалось найти класс com.google.firebase.FirebaseOptions ' Как подключить слушателя к переключателю AbstractMethodError при использовании RxJavaCallAdapterFactory при дооснащении 2 SocketException при загрузке большого размера zip-файла Преобразование битмапа: создание растрового изображения, которое исключает прозрачные стороны из прозрачного растрового изображения Не удалось найти следующие классы: android.support.v7.internal.app.WindowDecorActionBar

Поместите неопределенный прогресс в качестве нижнего колонтитула в сетке RecyclerView

Как получить неопределенный круговой индикатор для «Прокрутка вверх, чтобы загрузить больше» в сетку RecycleView?

Шаблон описан там: http://www.google.com/design/spec/components/progress-activity.html#progress-activity-behavior в разделе «Двухфазные нагрузки» и «Пример 2: прокрутка вверх, чтобы загрузить больше "Примеры видео.

Я пытаюсь выполнить это с помощью нового RecyclerView, но я не могу найти способ «не слишком хакерский», чтобы сделать это, во-первых, потому что нет возможности добавить нижний колонтитул, который покрывает полную строку в сетке , Какие-либо предложения?

Solutions Collecting From Web of "Поместите неопределенный прогресс в качестве нижнего колонтитула в сетке RecyclerView"

Это очень просто сделать.

Решение состоит в том, чтобы использовать тот же подход LinearLayoutManager с GridLayoutManager а затем использовать метод setSpanSizeLookup в LayoutManager следующим образом:

 mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { @Override public int getSpanSize(int position) { switch(myAdapter.getItemViewType(position)){ case MyAdapter.VIEW_TYPES.Product: return 1; case MyAdapter.VIEW_TYPES.Progress: return 2; //number of columns of the grid default: return -1; } } }); 

Это автоматически сделает элемент обложкой полной строки сетки (если строка не полностью пуста, этот элемент переходит к следующей строке).

Обратите внимание, что решение ниже содержит некоторые потенциальные проблемы и ограничения, для пересмотренного решения, пожалуйста, проверьте это. Добавление элементов в Endless Scroll RecyclerView с помощью ProgressBar внизу

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

progress_item.xml

 <?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"> <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" android:id="@+id/progressBar" android:indeterminate="true" style="@android:style/Widget.Holo.ProgressBar" android:layout_gravity="center_horizontal"/> </LinearLayout> 

activity_main.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:ring="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" android:scrollbars="vertical" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> 

EndlessRecyclerOnScrollListener.java

 public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener { public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName(); private int previousTotal = 0; // The total number of items in the dataset after the last load private boolean loading = true; // True if we are still waiting for the last set of data to load. private int visibleThreshold = 1; // The minimum amount of items to have below your current scroll position before loading more. int firstVisibleItem, visibleItemCount, totalItemCount; private int current_page = 1; private LinearLayoutManager mLinearLayoutManager; public EndlessRecyclerOnScrollListener(LinearLayoutManager linearLayoutManager) { this.mLinearLayoutManager = linearLayoutManager; } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); visibleItemCount = recyclerView.getChildCount(); totalItemCount = mLinearLayoutManager.getItemCount(); firstVisibleItem = mLinearLayoutManager.findFirstVisibleItemPosition(); if (loading) { if (totalItemCount > previousTotal+1) { loading = false; previousTotal = totalItemCount; } } if (!loading && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) { // End has been reached // Do something current_page++; onLoadMore(current_page); loading = true; } } public abstract void onLoadMore(int current_page); } 

MyAdapter.java

 public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final int VIEW_ITEM = 1; private final int VIEW_PROG = 0; private List<String> mDataset; public static class TextViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public TextViewHolder(View v) { super(v); mTextView = (TextView)v.findViewById(android.R.id.text1); } } public static class ProgressViewHolder extends RecyclerView.ViewHolder { public ProgressBar progressBar; public ProgressViewHolder(View v) { super(v); progressBar = (ProgressBar)v.findViewById(R.id.progressBar); } } public MyAdapter(List<String> myDataset) { mDataset = myDataset; } @Override public int getItemViewType(int position) { return mDataset.get(position)!=null? VIEW_ITEM: VIEW_PROG; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder vh; if(viewType==VIEW_ITEM) { View v = LayoutInflater.from(parent.getContext()) .inflate(android.R.layout.simple_list_item_1, parent, false); vh = new TextViewHolder(v); }else { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.progress_item, parent, false); vh = new ProgressViewHolder(v); } return vh; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof TextViewHolder){ ((TextViewHolder)holder).mTextView.setText(mDataset.get(position)); }else{ ((ProgressViewHolder)holder).progressBar.setIndeterminate(true); } } @Override public int getItemCount() { return mDataset.size(); } } 

И, наконец, MainActivity.java

 package virtoos.com.testapps; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import java.util.ArrayList; import java.util.List; public class MainActivity extends Activity { private RecyclerView mRecyclerView; private LinearLayoutManager mLayoutManager; private MyAdapter mAdapter; private final List<String> myDataset = new ArrayList<>(); private Handler handler; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); handler = new Handler(); addItems(20); mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view); // use this setting to improve performance if you know that changes // in content do not change the layout size of the RecyclerView mRecyclerView.setHasFixedSize(true); mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); mAdapter = new MyAdapter(myDataset); mRecyclerView.setAdapter(mAdapter); //mRecyclerView.setItemAnimator(new DefaultItemAnimator()); mRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) { @Override public void onLoadMore(int current_page) { //add progress item myDataset.add(null); mAdapter.notifyItemInserted(myDataset.size()); handler.postDelayed(new Runnable() { @Override public void run() { //remove progress item myDataset.remove(myDataset.size() - 1); mAdapter.notifyItemRemoved(myDataset.size()); //add items one by one for (int i = 0; i < 15; i++) { myDataset.add("Item"+(myDataset.size()+1)); mAdapter.notifyItemInserted(myDataset.size()); } //or you can add all at once but do not forget to call mAdapter.notifyDataSetChanged(); } }, 2000); System.out.println("load"); } }); } } 

Вот небольшая модификация ответа @Vilen Melkumyan на RecyclerView.Adapter который работал лучше для меня. И вы можете использовать свой EndlessRecyclerOnScrollListener любым способом, который вы хотите для загрузки данных, а также включение или отключение EndlessRecyclerOnScrollListener колонтитула в любое время.

PS: Он работал с GridLayoutManager .

 public class MyRecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private final int VIEW_TYPE_ITEM = 1; private final int VIEW_TYPE_PROGRESSBAR = 0; private boolean isFooterEnabled = true; private List<String> items; public static class TextViewHolder extends RecyclerView.ViewHolder { public TextView mTextView; public TextViewHolder(View v) { super(v); mTextView = (TextView)v.findViewById(android.R.id.text1); } } public static class ProgressViewHolder extends RecyclerView.ViewHolder { public ProgressBar progressBar; public ProgressViewHolder(View v) { super(v); progressBar = (ProgressBar)v.findViewById(R.id.progressBar); } } public MyRecyclerViewAdapter(List<String> myDataset) { items = myDataset; } @Override public int getItemCount() { return (isFooterEnabled) ? items.size() + 1 : items.size(); } @Override public int getItemViewType(int position) { return (isFooterEnabled && position >= items.size() ) ? VIEW_TYPE_PROGRESSBAR : VIEW_TYPE_ITEM; } /** * Enable or disable footer (Default is true) * * @param isEnabled boolean to turn on or off footer. */ public void enableFooter(boolean isEnabled){ this.isFooterEnabled = isEnabled; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { RecyclerView.ViewHolder vh; if(viewType== VIEW_TYPE_ITEM) { View v = LayoutInflater.from(parent.getContext()) .inflate(android.R.layout.simple_list_item_1, parent, false); vh = new TextViewHolder(v); }else { View v = LayoutInflater.from(parent.getContext()) .inflate(R.layout.progressbar, parent, false); vh = new ProgressViewHolder(v); } return vh; } @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { if(holder instanceof ProgressViewHolder){ ((ProgressViewHolder)holder).progressBar.setIndeterminate(true); } else if(items.size() > 0 && position < items.size()) { ((TextViewHolder)holder).mTextView.setText(items.get(position)); } } } 

Мои 2 цента, мир !!

Проверьте свое решение в https://github.com/ramirodo/endless-recycler-view-adapter или https://bintray.com/ramiro/android/endless-recycler-view-adapter . Здесь есть пример, а также шаги по настройке библиотеки в вашем проекте.

Вам просто нужно расширить свой адаптер просмотра ресайклеров, выполнив необходимые методы. Также вы можете настроить макет нижнего колонтитула прогресса.