簡體   English   中英

如何使用Recycleview無限滾動加載更多內容?

[英]How to infinite scroll load more with Recycleview?

如何使用Recycleview無限滾動加載更多內容

當用戶滾動動態數據自動獲取並顯示時,我如何顯示結果像無限方式。 因此加載時間消耗和應用程序將正常運行。

文件名: MainActivity.java //我想顯示的主要Java文件加載更多

        package com.ejobbox.ejobbox;

        import android.os.Bundle;
        import android.support.v7.app.AppCompatActivity;
        import android.support.v7.widget.LinearLayoutManager;
        import android.support.v7.widget.RecyclerView;
        import android.text.format.DateFormat;
        import android.util.Log;
        import android.view.View;
        import android.widget.ProgressBar;

        import java.util.ArrayList;
        import java.util.List;
        import retrofit2.Call;
        import retrofit2.Callback;
        import retrofit2.Response;
        import retrofit2.Retrofit;
        import retrofit2.converter.gson.GsonConverterFactory;

        public class MainActivity extends AppCompatActivity {

            private RecyclerView recyclerView;
            private ProgressBar progressBar;
            private LinearLayoutManager mLayoutManager;
            private RecyclerViewAdapter adapter;
            private ArrayList<Model> list;
            private String baseURL="http://mywebsite.com/";
            public static List<WPPost> mListPost;
            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_main);

                recyclerView= findViewById(R.id.recycler_view);
                progressBar=findViewById(R.id.progressbar);

                mLayoutManager=new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL,false);
                recyclerView.setLayoutManager(mLayoutManager);

                list=new ArrayList<Model>();
                // call retrofit

                getRetrofit();

                adapter=new RecyclerViewAdapter(list,MainActivity.this);
                recyclerView.setAdapter(adapter);

            }

            private void getRetrofit(){
                Retrofit retrofit=new Retrofit.Builder()
                        .baseUrl(baseURL)
                        .addConverterFactory(GsonConverterFactory.create())
                        .build();
                RetrofitArrayApi service = retrofit.create(RetrofitArrayApi.class);
               Call<List<WPPost>> call= service.getPostInfo();
               call.enqueue(new Callback<List<WPPost>>() {

                   @Override
                   public void onResponse(Call<List<WPPost>> call, Response<List<WPPost>> response) {
                       Log.e("mainactivty","response"+ response.body());
                       progressBar.setVisibility(View.GONE);

                       for(int i=0; i<response.body().size();i++){

                           Log.e ("main","Title"+ response.body().get(i).getTitle().getRendered()+"  "+
                                        response.body().get(i).getId());

                           String tempdetails=response.body().get(i).getExcerpt().getRendered().toString();
                           tempdetails=tempdetails.replace("<p>","");
                           tempdetails=tempdetails.replace("</p>","");
                           String linkdetail=response.body().get(i).getLink().toString();

                           String date=response.body().get(i).getDate().toString();

                           list.add(new Model(Model.IMAGE_TYPE, response.body().get(i).getTitle().getRendered(),
                                   tempdetails,date,
                                   response.body().get(i).getLinks().getWpFeaturedmedia().get(0).getHref(),linkdetail) );
                       }
                       adapter.notifyDataSetChanged();
                   }

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

                   }
               });
            }
        }

這是我定義了回收站視圖適配器的RecyclearViewAdapter。

文件名: RecyclearViewAdapter.java // Recyclear視圖適配器文件

    package com.ejobbox.ejobbox;

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

    import java.util.ArrayList;

    public class RecyclerViewAdapter extends RecyclerView.Adapter{
        private ArrayList<Model> dataset;
        private Context mContext;

        public RecyclerViewAdapter(ArrayList<Model> mlist, Context context) {
          this.dataset=mlist;
          this.mContext=context;
        }

        public static class ImageTypeViewHolder extends RecyclerView.ViewHolder{
            TextView title,subtitle,link,date;
            ImageView imageView;

            public ImageTypeViewHolder(View itemView){
                super(itemView);
                this.title=(TextView)itemView.findViewById(R.id.title);
                this.link=(TextView)itemView.findViewById(R.id.link);
                this.subtitle=(TextView) itemView.findViewById(R.id.subtitle);
                this.imageView=(ImageView) itemView.findViewById(R.id.icon);
                this.date=(TextView)itemView.findViewById(R.id.date);
            }
        }
        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.postdetails,parent,false);
            return new ImageTypeViewHolder(view);
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
            final Model object=dataset.get(position);


            ((ImageTypeViewHolder) holder).title.setText(object.title);
            ((ImageTypeViewHolder) holder).subtitle.setText(object.subtitle);
            //((ImageTypeViewHolder) holder).link.setText(object.link);
            ((ImageTypeViewHolder) holder).date.setText((CharSequence) object.date);

            ((ImageTypeViewHolder) holder).title.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                    Intent intent=new Intent(mContext, WPPostDetails.class);
                    intent.putExtra("itemPosition",position);

                    intent.putExtra("link",object.link.toString());
                    mContext.startActivity(intent);

                }
            });

        }

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

不要使用無限滾動,它不會按預期工作。

你可以用這個

        recyclerView.addOnScrollListener(new OnScrollListener() {
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {


            if (isLastItemDisplaying())
            {
                scrollCount=scrollCount+10;
                L.v("scroll count",""+recyclerView.getAdapter().getItemCount());
                loadMoreItems(scrollCount);

            }

            }
        });

private boolean isLastItemDisplaying()
{
    if (storiesList.getAdapter().getItemCount()!=0) {
        int last_visible_count=manager.findFirstCompletelyVisibleItemPosition();
        if (last_visible_count!=RecyclerView.NO_POSITION && last_visible_count==storiesList.getAdapter().getItemCount()-1) {
            return true;
        }
    }
    return false;
}

在該loadMoreItems方法內調用您的api。 確保在每次api調用時將此滾動計數發送到您的服務器。在sql查詢中,您必須執行此操作

例如:第一次,您的計數為0; SELECT * FROM posts LIMIT 0,10

在Scroll上,您的scrollCount值將增加10(您可以使用您的值,滾動計數值將獲取接下來的10行)

SELECT * FROM posts LIMIT 10,10

您只需將新數據添加到列表電影的最后一個位置,一切就可以正常工作。 為了這-

創建一個新的List <Model> newList列表 ,並將更新后的數據添加到其中。 現在將newList添加到列表中並通知適配器。 就像下面一樣

  List<Model> newList = new ArrayList<>();

  // your code..

  recyclerView.addOnScrollListener(new EndlessScrollListener(mLayoutManager) {
        @Override
        public void onLoadMore(int page, int totalItemsCount) {
            loadingMore=true;
            getRetrofit();

            int currentSize = adapter.getItemCount();
            list.addAll(newList);
            adapter.notifyItemRangeInserted(currentSize, list.size() - 2);
        }
    });

在這里,您可以找到EndlessScrollListener類。

請查看我的其他相關答案以了解更多詳細信息-

如何使用AsyncTask或任何其他方法在ListView中加載更多項目

通過Json請求在recyclerview中連續滾動,並使用上一個添加新項

希望它會有所幫助。

這是使用從各種來源編譯的簡單庫的無窮滾動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();

可以在這里找到更多示例

希望這可以幫助 :)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM