android - 如何在android中无休止地向RecyclerView显示布局

标签 android android-recyclerview retrofit2 gson

我想从服务器加载数据并在我的应用程序 (RecyclerView) 中显示,对于这项工作,当应用程序启动时它显示 10 个帖子,当滚动 recyclerView 时显示另一个帖子。

我写了下面的代码,但是当收到其他 10 个帖子时,不显示 加载布局!我希望在获取其他 10 个帖子时,首先显示加载 布局然后显示其他 10 个帖子!

为了连接到互联网,我使用 Retrofit v2,对于 recyclerView 的自定义 Endless 方法,我使用此类: EndLess Class

我的 Activity 代码:

public class Category_page extends AppCompatActivity implements ConnectivityReceiver.ConnectivityReceiverListener {

    private static final long RIPPLE_DURATION = 250;
    private Toolbar toolbar;
    private TextView toolbar_title;
    private ImageView toolbar_menuImage;
    private Button categoryCheckNet_button;
    private RelativeLayout root;
    private CategoryAdapter mAdapter;
    private RecyclerView cat_recyclerView;
    private LinearLayoutManager mLayoutManager;
    private RelativeLayout loadLayout, checkNetLayout;
    private String catTitle = "";
    private Integer catID;
    private Bundle bundle;
    private int pageCount = 1;
    private Context context;

    private List<R_CatModel> models;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.category_page);

        // Hide StatusBar color
        getWindow().getDecorView().setSystemUiVisibility(
                View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);

        // Initializing
        context = Category_page.this;
        toolbar = (Toolbar) findViewById(R.id.category_toolbar);
        cat_recyclerView = (RecyclerView) findViewById(R.id.category_recycler);
        toolbar_title = (TextView) toolbar.findViewById(R.id.toolbar_pages_title);
        mLayoutManager = new LinearLayoutManager(this);
        root = (RelativeLayout) findViewById(R.id.category_root);
        loadLayout = (RelativeLayout) findViewById(R.id.category_empty_layout);
        checkNetLayout = (RelativeLayout) findViewById(R.id.category_checkInternet_layout);
        categoryCheckNet_button = (Button) checkNetLayout.findViewById(R.id.checkNet_button);
        // Toolbar
        setSupportActionBar(toolbar);
        if (toolbar != null) {
            getSupportActionBar().setTitle("");
        }

        // Receive Data
        bundle = getIntent().getExtras();
        catID = bundle.getInt("categoryID");
        if (bundle != null) {
            catTitle = bundle.getString("categoryTitle");
        }
        if (catTitle != null) {
            toolbar_title.setText(catTitle);
        }

        // Load Data
        loadData();

        // Load Progress
        loadLayout.setVisibility(View.VISIBLE);

        // Menu
        View guillotineMenu = LayoutInflater.from(this).inflate(R.layout.menu_layout, null);
        root.addView(guillotineMenu);
        toolbar_menuImage = (ImageView) toolbar.findViewById(R.id.toolbar_pages_logo);
        new GuillotineAnimation.GuillotineBuilder(guillotineMenu, guillotineMenu.findViewById(R.id.menu_layout_image), toolbar_menuImage)
                .setStartDelay(RIPPLE_DURATION)
                .setActionBarViewForAnimation(toolbar)
                .setClosedOnStart(true)
                .build();
        // RecyclerView
        cat_recyclerView.setLayoutManager(mLayoutManager);
        cat_recyclerView.setHasFixedSize(true);
        cat_recyclerView.addOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
            @Override
            public void onLoadMore(int current_page) {

                Retrofit_ApiInterface apiInterface = Retrofit_ApiClient.getClient().create(Retrofit_ApiInterface.class);
                Call<R_CatModelResponse> call = apiInterface.getCatMoreResponse(catID, current_page);

                call.enqueue(new Callback<R_CatModelResponse>() {
                    @Override
                    public void onResponse(Call<R_CatModelResponse> call, Response<R_CatModelResponse> response) {

                        if (response != null) {
                            mAdapter.addNewItem(response.body().getCat_posts());
                            //loadLayout.setVisibility(View.GONE);
                        } else {
                            //loadLayout.setVisibility(View.VISIBLE);
                            Toast.makeText(Category_page.this, "Error 2", Toast.LENGTH_SHORT).show();
                            TastyToast.makeText(context, "خطایی رخ داده است", TastyToast.LENGTH_LONG, TastyToast.ERROR);
                        }
                    }

                    @Override
                    public void onFailure(Call<R_CatModelResponse> call, Throwable t) {

                    }
                });
            }
        });

    }

    private void loadData() {
        boolean isConnected = ConnectivityReceiver.isConnected();

        retrofitData(isConnected);
    }

    private void retrofitData(boolean isConnect) {

        if (isConnect) {
            Retrofit_ApiInterface apiInterface = Retrofit_ApiClient.getClient().create(Retrofit_ApiInterface.class);
            Call<R_CatModelResponse> call = apiInterface.getCatResponse(catID);

            call.enqueue(new Callback<R_CatModelResponse>() {
                @Override
                public void onResponse(Call<R_CatModelResponse> call, Response<R_CatModelResponse> response) {

                    if (response != null) {
                        models = response.body().getCat_posts();

                        mAdapter = new CategoryAdapter(context, cat_recyclerView, models);
                        cat_recyclerView.setAdapter(mAdapter);
                        loadLayout.setVisibility(View.GONE);

                    } else {
                        //loadLayout.setVisibility(View.VISIBLE);
                        Toast.makeText(Category_page.this, "Error 2", Toast.LENGTH_SHORT).show();
                        TastyToast.makeText(context, "خطایی رخ داده است", TastyToast.LENGTH_LONG, TastyToast.ERROR);
                    }

                    checkNetLayout.setVisibility(View.GONE);
                }

                @Override
                public void onFailure(Call<R_CatModelResponse> call, Throwable t) {

                    //loadLayout.setVisibility(View.VISIBLE);
                    //TastyToast.makeText(context, "لطفا برنامه را مجددا باز کنید", TastyToast.LENGTH_LONG, TastyToast.ERROR);
                    Toast.makeText(Category_page.this, "Error 2", Toast.LENGTH_SHORT).show();
                    //Cat_EmptyLayout.setVisibility(View.VISIBLE);
                    Log.e("CatResponseError", "Error : " + t);

                }
            });
        } else {
            //loadLayout.setVisibility(View.GONE);
            checkNetLayout.setVisibility(View.VISIBLE);
            if (mAdapter != null) {
                mAdapter.clear();
                cat_recyclerView.setAdapter(mAdapter);
            }
            categoryCheckNet_button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    loadData();
                }
            });
        }
    }

    public void post_back(View view) {
        onBackPressed();
    }

    @Override
    protected void attachBaseContext(Context newBase) {
        super.attachBaseContext(CalligraphyContextWrapper.wrap(newBase));
    }

    @Override
    protected void onResume() {
        super.onResume();
        // register connection status listener
        MyApplication.getInstance().setConnectivityListener(this);
    }

    @Override
    public void onNetworkConnectionChanged(boolean isConnected) {
        retrofitData(isConnected);
    }
}

我的适配器代码:

public class CategoryAdapter extends RecyclerView.Adapter {

    private List<R_CatModel> mDateSet;
    private Context mContext;

    private final int VIEW_ITEM = 1;
    private final int VIEW_PROG = 0;

    // The minimum amount of items to have below your current scroll position
    // before loading more.
    private int visibleThreshold = 10;
    private int lastVisibleItem, totalItemCount;
    private boolean loading;
    private OnLoadMoreListener onLoadMoreListener;

    public CategoryAdapter(Context context, RecyclerView recyclerView, List<R_CatModel> dataSet) {
        this.mContext = context;
        this.mDateSet = dataSet;

        if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {

            final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) recyclerView
                    .getLayoutManager();
            recyclerView
                    .addOnScrollListener(new RecyclerView.OnScrollListener() {
                        @Override
                        public void onScrolled(RecyclerView recyclerView,
                                               int dx, int dy) {
                            super.onScrolled(recyclerView, dx, dy);
                            totalItemCount = linearLayoutManager.getItemCount();
                            lastVisibleItem = linearLayoutManager
                                    .findLastVisibleItemPosition();
                            if (!loading
                                    && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                                // End has been reached
                                // Do something
                                if (onLoadMoreListener != null) {
                                    onLoadMoreListener.onLoadMore();
                                }
                                loading = true;
                            }
                        }
                    });
        }
    }

    @Override
    public int getItemViewType(int position) {
        return mDateSet.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(
                    R.layout.post_card_layout, parent, false);

            vh = new DataViewHolder(v);
        } else {
            View v = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.progressbar_item, parent, false);

            vh = new ProgressViewHolder(v);
        }
        return vh;
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

        if (holder instanceof DataViewHolder) {
            ((DataViewHolder) holder).main_post_title.setText(Html.fromHtml(mDateSet.get(position).getTitle()));

            Glide.with(mContext)
                    .load(mDateSet.get(position).getThumbnail_images().getMedium().getUrl())
                    .placeholder(R.drawable.post_image)
                    .crossFade()
                    .override(600, 350)
                    .into(((DataViewHolder) holder).main_post_image);

            ((DataViewHolder) holder).main_post_content.setText(Html.fromHtml(mDateSet.get(position).getContent()));

            // Convert Date ////////
            String date = mDateSet.get(position).getDate();
            String[] parts = date.split(" ");
            String datePart = parts[0];
            String timePart = parts[1];

            int year;
            int month;
            int day;

            String[] dateParts = datePart.split("-");
            year = Integer.parseInt(dateParts[0]);
            month = Integer.parseInt(dateParts[1]);
            day = Integer.parseInt(dateParts[2]);

            JalaliCalendar.YearMonthDate georgianDate = new JalaliCalendar.YearMonthDate(year, month, day);
            JalaliCalendar.YearMonthDate JalaliDate = JalaliCalendar.gregorianToJalali(georgianDate);
            String jalaliDateTime = JalaliDate.toString();

            ((DataViewHolder) holder).main_dateTime.setText(jalaliDateTime);
            ////////////////////////

            ((DataViewHolder) holder).main_author.setText(Html.fromHtml(mDateSet.get(position).getCatAuthor().getAuthorName()));
            ((DataViewHolder) holder).main_author.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    R_CatModel model = mDateSet.get(position);
                    v.getContext().startActivity(new Intent(v.getContext(), Profile_page.class));
                    //.putExtra("author", model.getAuthor())
                    //.putExtra("authorID", model.getAuthorID())
                    //.putExtra("authorStatus", model.getAuthorStatus()));
                }
            });

            ((DataViewHolder) holder).main_category.setText(Html.fromHtml(String.valueOf(mDateSet.get(position).getCategories().get(0).getCatTitle())));
            ((DataViewHolder) holder).main_category.setTextColor(mContext.getResources().getColor(R.color.colorAccent));

            ((DataViewHolder) holder).main_post_image.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    int pos = holder.getPosition();
                    R_CatModel model = mDateSet.get(pos);
                    v.getContext().startActivity(new Intent(v.getContext(), PostShow_page.class)
                            .putExtra("title", model.getTitle())
                            .putExtra("image", model.getThumbnail())
                            .putExtra("content", model.getContent())
                            .putExtra("dateTime", model.getDate())
                            //.putExtra("author", model.getAuthor())
                            .putExtra("category", model.getTitle()));

                }
            });

        } else {
            ((ProgressViewHolder) holder).progressBar.setVisibility(View.VISIBLE);
        }
    }

    public void setLoaded() {
        loading = false;
    }

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

    public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
        this.onLoadMoreListener = onLoadMoreListener;
    }

    public void remove(int position) {
        mDateSet.remove(position);
        notifyItemRemoved(position);
    }

    public void clear() {
        mDateSet.clear();
        notifyDataSetChanged();
    }

    public void addNewItem(List<R_CatModel> newContent) {
        int start = this.mDateSet.size();//contents is a List of your items initialize it your constructor
        int end = newContent.size();
        mDateSet.addAll(newContent);
        notifyItemRangeInserted(start + 1, end);
    }


    public void add(List<R_CatModel> models) {
        mDateSet.addAll(models);
        notifyDataSetChanged();
    }

    public void update(List<R_CatModel> models) {
        mDateSet.clear();
        mDateSet.addAll(models);
        notifyDataSetChanged();
    }

    public class DataViewHolder extends RecyclerView.ViewHolder {

        private TextView main_post_title, main_post_content, main_dateTime, main_author, main_category;
        private ImageView main_post_image;

        public DataViewHolder(final View itemView) {
            super(itemView);

            main_post_title = (TextView) itemView.findViewById(R.id.post_content_title);
            main_post_image = (ImageView) itemView.findViewById(R.id.post_picture_image);
            main_post_content = (TextView) itemView.findViewById(R.id.post_content_text);
            main_dateTime = (TextView) itemView.findViewById(R.id.post_date_text);
            main_author = (TextView) itemView.findViewById(R.id.post_name_text);
            main_category = (TextView) itemView.findViewById(R.id.post_category_text);
        }
    }

    public static class ProgressViewHolder extends RecyclerView.ViewHolder {
        public AVLoadingIndicatorView progressBar;

        public ProgressViewHolder(View v) {
            super(v);
            progressBar = (AVLoadingIndicatorView) v.findViewById(R.id.avloadingIndicatorView);
        }
    }
}

如何在获取其他 10 个帖子时显示加载布局?

最佳答案

让我向您解释一个解决这个问题的简单方法:

1- 将线性 progressBar 放在 RecyclerView 下方,默认可见性 gone:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/layout_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/gray_lightest">

    <android.support.v7.widget.RecyclerView
        android:id="@+id/lv_paging"
        style="@style/RecycleView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:paddingBottom="4dp"
        android:paddingTop="4dp"
        tools:listitem="@layout/row_list_base" />

    <com.rey.material.widget.ProgressView
        android:id="@+id/pvl_loading"
        style="@style/LinearProgress"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:visibility="gone"
        android:layout_alignParentBottom="true" />

</RelativeLayout>

2- 在您的 onLoadMore 中,将 ProgressBar 的可见性更改为 Visible:

 scrollListener = new EndlessRecyclerOnScrollListener((LinearLayoutManager) mRecyclerView.getLayoutManager()) {
            @Override
            public void onLoadMore(int page) {
                progressBar.setVisiblity(View.VISIBLE);
                callWebService(page);
            }
        };
        mRecyclerView.addOnScrollListener(scrollListener);

3- 当您的请求完成时,将可见性更改为gone:

public void onResponse(Call<YOUR_OBJECT> call, Response<YOUR_OBJECT> response) {     
                progressBar.setVisiblity(View.GONE);
                processResponse(response);
            }

替代方法:如果您想在适配器中处理进度条,请参阅完整代码 here .主要关键部分代码:

1- 添加 showLoadingView 方法到适配器:

 public void showLoadingView() {
        showLoadingView = true;
        notifyItemChanged(0);
    }

2- 将 getViewType 更改为:

@Override
    public int getItemViewType(int position) {
        if (showLoadingView && position == 0) {
            return VIEW_TYPE_LOADER;
        } else {
            return VIEW_TYPE_DEFAULT;
        }
    }

关于android - 如何在android中无休止地向RecyclerView显示布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39341697/

相关文章:

java - 如何检查请求的 TLS 版本

android - Android 上的 Google map 工具栏不显示

Android 应用程序在恢复 Activity 后无法运行

android - 执行大量数据列表的最佳方式[当前使用 RecyclerView]

android - 我如何单元测试(使用 JUnit 或 mockito)recyclerview 项目点击

java - Android 在循环后将所有对象添加到列表中

android - React Native - Dimensions.set() 不起作用?

android - 从蓝牙连接的 Android 应用程序控制 Arduino 上的 LED 的问题

android - swipeRefresh 正在运行时,替换 Fragment 无法正常工作

java - 我应该在哪里进行改造操作?