【问题标题】:LoadMore Recycler View From Api从 Api 加载更多回收器视图
【发布时间】:2017-10-26 12:11:06
【问题描述】:

我在 Android 中有 Recycler 视图,我需要在 recycler 视图中实现加载更多,我在互联网上搜索但未能解决我的问题,这是我的代码,请帮助

这是适配器

public class NewsReycelerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    private Context context;
    List<String> Dates , Titles , Details , Images;
    public static String NewsDetail,NewsDate ,NewsTitle;
    public final int TYPE_NEWS = 0;
    public final int TYPE_LOAD = 1;
    private int visibleThreshold = 2;
    private int lastVisibleItem, totalItemCount;
    private boolean loading;
    private OnLoadMoreListener onLoadMoreListener;
    public NewsReycelerViewAdapter(RecyclerView recyclerView,Context context , List<String> stringsDate , List<String> stringTitles ,  List<String> stringDetails ,List<String> stringImage,final JPANewsFragment fragment) {

        this.context = context;
        this.Dates = stringsDate;
        this.Titles = stringTitles;
        this.Details = stringDetails;
        this.Images = stringImage;

        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();
                        }
                        fragment.getHtmlNewsData("1");
                        loading = true;
                    }
                }
            });
        }
    }
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater inflater = LayoutInflater.from(context);

        if(viewType==TYPE_NEWS){
            return new Item_Holder(inflater.inflate(R.layout.news_adapter_item,parent,false));
        }else{
            return new LoadHolder(inflater.inflate(R.layout.item_loading,parent,false));
        }


    }
    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        ((Item_Holder)holder).Date.setText(Dates.get(position));
        ((Item_Holder)holder).Title.setText(Titles.get(position));
        NewsDetail = Details.get(position);
        NewsDate = Dates.get(position);
        NewsTitle = Titles.get(position);
        ((Item_Holder)holder).itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ((MainActivity)context).changeFragmentMethod(new NewsDetailsFragment(),context.getResources().getString(R.string.news_details));
            }
        });



    }
    @Override
    public int getItemCount() {
        return Dates == null ? 0 : Dates.size();
    }



    //////////////////////////////////////////////////////////////////////////////////
    public class Item_Holder extends RecyclerView.ViewHolder {
        TextView Title , Date ;
        ImageView jpaThumbnail;
        public Item_Holder(View itemView) {
            super(itemView);
            Title = (TextView) itemView.findViewById(R.id.textView_title);
            Date = (TextView) itemView.findViewById(R.id.textView_date);
            jpaThumbnail = (ImageView) itemView.findViewById(R.id.thumbnail);

        }
    }
    static class LoadHolder extends RecyclerView.ViewHolder{
        public LoadHolder(View itemView) {
            super(itemView);
        }
    }

    @Override
    public int getItemViewType(int position) {
        return Dates.get(position) != null ? TYPE_NEWS : TYPE_LOAD;
    }

    public void setOnLoadMoreListener(OnLoadMoreListener mOnLoadMoreListener) {
        this.onLoadMoreListener = mOnLoadMoreListener;
    }
    public void setLoaded() {
        loading = false;
    }


}

第一个 api 有 10 个项目,当用户滑动时,我需要从另一个页面加载更多,

这是在我的主要活动中编写的代码

 newsReycelerViewAdapter = new NewsReycelerViewAdapter(recyclerViewNews,context, stringsDate, stringsTitle, stringsDetails,stringsImages,new JPANewsFragment());
                    recyclerViewNews.setLayoutManager(new LinearLayoutManager(context));
                    recyclerViewNews.setAdapter(newsReycelerViewAdapter);
                    loadingProgressBar.setVisibility(View.GONE);
                    newsReycelerViewAdapter.setLoaded();
                    newsReycelerViewAdapter.notifyDataSetChanged();

请告诉我如何解决这个问题。

【问题讨论】:

  • 您的代码遇到了什么问题?

标签: android android-recyclerview


【解决方案1】:

首先为您的RecyclerView 添加一个addOnScrollListener() 并检测向下滚动

    recyclerViewNews.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            if (dy > 0) {
                Log.e("test","reached the last element of recyclerview");
                visibleItemCount = mLinearLayoutManager.getChildCount();
                totalItemCount = mLinearLayoutManager.getItemCount();
                pastVisiblesItems = mLinearLayoutManager.findFirstVisibleItemPosition();

                if (loading) {
                    if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
                        loading = false;
                        fetchData();
                    }
                }
            }
        }
    });

第二创建一个函数 fetchData() 以向您的适配器添加更多数据 然后调用newsReycelerViewAdapter.notifyDataSetChanged();通知数据集更改,更改loading=true

在您的活动主要创建字段为

int pastVisiblesItems, visibleItemCount, totalItemCount;
boolean loading = true;

【讨论】:

  • @MoayedAlayaseh 粘贴你修改过的代码你尝试了多少
【解决方案2】:

这里是使用从各种来源编译的简单库来简单实现 LoadMore RecyclerView 的示例。

在build.gradle中添加这一行

implementation 'com.hereshem.lib:awesomelib:2.0.1'

在Activity中创建RecyclerView布局

<com.hereshem.lib.recycler.MyRecyclerView
        android:id="@+id/recycler"
        app:layoutManager="LinearLayoutManager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

通过传递支持的类创建一个ViewHolder

public static class EVHolder extends MyViewHolder<Events> {
    TextView date, title, summary;
    public EVHolder(View v) {
        super(v);
        date = v.findViewById(R.id.date);
        title = v.findViewById(R.id.title);
        summary = v.findViewById(R.id.summary);
    }
    @Override
    public void bindView(Events c) {
        date.setText(c.date);
        title.setText(c.title);
        summary.setText(c.summary);
    }
}

通过在适配器中传递项目、类和布局来创建项目列表变量和适配器

List<Events> items = new ArrayList<>();
MyRecyclerView recycler = findViewById(R.id.recycler);
RecyclerViewAdapter adapter = new RecyclerViewAdapter(this, items, EVHolder.class, R.layout.row_event);
recycler.setAdapter(adapter);

ClickListener 和 LoadMore Listener 可以通过以下几行添加

recycler.setOnItemClickListener(new MyRecyclerView.OnItemClickListener() {
    @Override
    public void onItemClick(int position) {
        Toast.makeText(MainActivity.this, "Recycler Item Clicked " + position, Toast.LENGTH_SHORT).show();
    }
});

recycler.setOnLoadMoreListener(new MyRecyclerView.OnLoadMoreListener() {
    @Override
    public void onLoadMore() {
        loadData();
    }
});
loadData();

加载数据后必须调用它

recycler.loadComplete();

当不需要 LoadMore 时可以通过调用来隐藏 LoadMore 布局

recycler.hideLoadMore();

完整的例子可以在here找到

希望这会有所帮助:)

【讨论】:

    【解决方案3】:

    我的 loadmore 函数如下所示:

    private void loadMoreMessages() {
    
            DatabaseReference messageRef = mRootRef.child("messages").child(mThemaID);
            Query messageQuery = messageRef.orderByKey().endAt(mLastKey).limitToLast(10);
    
    
            messageQuery.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
    
                    Messages message = dataSnapshot.getValue(Messages.class);
    String messageKey = dataSnapshot.getKey();
    
    
                    if(!mPrevKey.equals(messageKey)){
                        messagesList.add(itemPos++, message);
    
                    }else {
    
                        mPrevKey = mLastKey;
                    }
    
    
    
                    if(itemPos == 1){
    
                        mLastKey = messageKey;
                    }
    
    
    
                    mAdapter.notifyDataSetChanged();
                    mLinearLayout.scrollToPositionWithOffset(itemPos-1, 0);
    
                  mRefreshLayout.setRefreshing(false);
    
    
                }
    
                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
    
                }
    
                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
    
                }
    
                @Override
                public void onCancelled(DatabaseError databaseError) {
    
                }
    
            });
    
        }
    

    和听众:

    mRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
    
            mCurrentPage++;
    
            itemPos = 0;
    
            loadMoreMessages();
    
        }
    });
    

    也许你可以用这个做点什么

    【讨论】:

    • sry 我不需要刷新我需要加载更多!!
    猜你喜欢
    • 2016-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    相关资源
    最近更新 更多