【问题标题】:android load RecyclerView when a RecyclerView reachs endsandroid在RecyclerView到达结束时加载RecyclerView
【发布时间】:2017-02-14 06:24:02
【问题描述】:

我有一个无尽的RecyclerView 和库PullLoadView

这个RecyclerView 是填充布局,我想当这个RecyclerView 加载它的所有项目并到达末尾时,我在它的底部加载另一个RecyclerView,它有自己的适配器和行布局并继续。

我需要这样的应用程序:

第一个RecyclerView

第一个RecyclerView 到达终点,新的RecyclerView 出现

新的RecyclerView 在全屏中继续第一个RecyclerView

xml代码:

<?xml version="1.0" encoding="utf-8"?>
  <LinearLayout 
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/activity_search"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.v7.widget.RecyclerView
    android:id="@+id/rvOne"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

<android.support.v7.widget.RecyclerView
    android:id="@+id/rvTwo"
    android:layout_width="match_parent"
    android:layout_height="match_parent"/>

 </LinearLayout>

【问题讨论】:

  • 您是否也只想将 Recyclerview 用于底部视图?可以用 ListView 作为底部的吗?
  • 你应该把这两个结合起来使用viewtypedeveloper.android.com/reference/android/support/v7/widget/…
  • 我不想要上面图片那样的东西,我只需要一个解决方案,让两个 match_parent recyclerViews 一个接一个
  • @MohammadHadi 发布您的 xml 代码。顺便说一句,您可以使用 NestedScrollView 来实现这一点。默认nestedscrollview展开里面的所有视图
  • @Ankush Bist 问题是我不知道我的 xml 会是什么样子,但是我编辑了我的问题并复制了带有内部视图的 xml

标签: android listview android-recyclerview


【解决方案1】:

将您的xml 源替换为以下源

 <?xml version="1.0" encoding="utf-8"?>

<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:scrollbars="none">
<LinearLayout
    android:id="@+id/activity_search"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvOne"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <android.support.v7.widget.RecyclerView
        android:id="@+id/rvTwo"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

</android.support.v4.widget.NestedScrollView>

【讨论】:

  • 它工作得很好,但是因为我的一个 RecyclerViews 是 Endless 的库,所以这个解决方案有一些问题,但我会修复它,谢谢你的帮助
  • 在这个解决方案中,RecyclerView 的所有行是否一次加载?是最优的吗?
  • 不是最佳的。但是是的,这将显示 api 结果并立即展开回收器视图。但是如果在回收站视图中加载更多,onScroll 加载更多回收站的数据也将调用
  • 我想我应该自定义第一个 RecyclerView 的最后一行,并在其中放入另一个带有它自己的适配器的 RecyclerView,然后在第一个 RecyclerView 从服务器获取最后一个数据时加载它。但我不知道如何正确编码
  • 可能你必须这样做。添加一个按钮视图更多或加载更多,这将重定向您进一步的活动/片段,您发现最符合您的要求,并在需要显示这 2 个回收站视图的第一页中仅显示少数元素。这是一个更好的主意,而且用户友好,否则用户永远不会知道您在底部有另一个回收器视图,就像您的第一个回收器视图包含 1000 条数据一样。
【解决方案2】:

将它们放在具有垂直方向 LinearLayout 的 NestedScrollView 中,并通过像这样设置它们的线性布局管理器来禁用它们的滚动。

LinearLayoutManager mLayoutManager = new LinearLayoutManager(this) {
        @Override
        public boolean canScrollVertically() {
            return false;
        }
    };

【讨论】:

  • 我的 xml 会是什么样子?
【解决方案3】:

使用 ListView 作为底部视图,并在 ListView 标题中放置 RecycerView

list_sample.xml(这是活动集内容的主要布局)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/content_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin">

    <ListView
        android:id="@+id/list_sample"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</RelativeLayout>

header_recycler.xml(列表视图标题布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/list_header"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</LinearLayout>

item_header.xml(标题列表的项目,即recyclerview one)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/item_header_regular"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:background="#FF2255" />


</LinearLayout>

list_item.xml(列表视图的项目)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="50dp" />

</LinearLayout>

HeaderRecyclerView.java(RecyclerView 适配器)

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import java.util.List;

public class HeaderRecyclerView extends RecyclerView.Adapter<HeaderRecyclerView.HeaderHolder> {
    private final Context context;
    private List<String> items;

    public HeaderRecyclerView(List<String> items, Context context) {
        this.items = items;
        this.context = context;
    }

    @Override
    public HeaderHolder onCreateViewHolder(ViewGroup parent,
                                           int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_header, parent, false);
        return new HeaderHolder(v);
    }

    @Override
    public void onBindViewHolder(HeaderHolder holder, int position) {
        String item = items.get(position);
        holder.textView.setText(item);
    }

    @Override
    public int getItemCount() {
        if (items == null) {
            return 0;
        }
        return items.size();
    }

    class HeaderHolder extends RecyclerView.ViewHolder {

        TextView textView;

        HeaderHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.item_header_regular);
        }
    }
}

BottomListAdapter.java(ListView 适配器)

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

public class BottomListAdapter extends BaseAdapter {

    private List<String> items = new ArrayList<>();
    private Context context;

    public BottomListAdapter(List<String> items, Context context) {
        this.items = items;
        this.context = context;
    }

    @Override
    public int getCount() {
        return items.size();
    }

    @Override
    public String getItem(int i) {
        return items.get(i);
    }

    @Override
    public long getItemId(int i) {
        return i;
    }

    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {

        TextView txtView;

        if (convertView == null) {
            convertView = LayoutInflater.from(context)
                    .inflate(R.layout.list_item, viewGroup, false);
            txtView = (TextView) convertView.findViewById(R.id.text);
            convertView.setTag(new ViewHolder(txtView));
        } else {
            ViewHolder viewHolder = (ViewHolder) convertView.getTag();
            txtView = viewHolder.txtView;
        }

        String string = getItem(i);
        txtView.setText(string);

        return convertView;
    }

    private static class ViewHolder {

        public final TextView txtView;

        public ViewHolder(TextView txtView) {
            this.txtView = txtView;
        }
    }

}

在你的 onCreate 中使用下面的初始化如下

 ListView listView = (ListView) findViewById(R.id.list_sample);

        View view = getLayoutInflater().inflate(R.layout.header_recycler, null);

        RecyclerView headerList = (RecyclerView) view.findViewById(R.id.list_header);

        List<String> strings = new ArrayList<>();

        for (int i = 0; i < 50; i++) {
            strings.add(i + "");
        }

        headerList.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false));
        headerList.setAdapter(new HeaderRecyclerView(strings, this));

        listView.addHeaderView(view);
        listView.setAdapter(new BottomListAdapter(strings, this));

【讨论】:

  • 我不明白,xml 代码是什么样子的?谢谢
  • 在你的 xml 中,你只有 ListView 给我一分钟我会编造代码并在这里发布。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
相关资源
最近更新 更多