RecyclerView无尽无限滚动发行 [英] RecyclerView Endless Infinite Scrolling Issue

查看:142
本文介绍了RecyclerView无尽无限滚动发行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想实现无尽无限滚动与RecyclerView,但我只获得第10条记录,没有得到接下来的10条记录,甚至没有得到,而试图滚动底部的任何进展。

虽然我是想取得下一个10个记录上滚动等等...但只得到第10条

在这里,我已经上传复制我JSON的 - 但我不能获取来自同一个URL的数据,这就是为什么我使用客户端的URL和本地主机。

我下面<一href="http://android-pratap.blogspot.in/2015/06/endless-recyclerview-with-progress-bar.html">this教程

下面是我的完整code,我可以知道我在做什么错误?

JSON:

  {
  名:
    {
      名:名称1
    },
    {
      名:名2
    },
    ....
    {
      名:60名
    }
  ]
}
 

登录:

  D /名称 - (13759):名称1
D /名称 - (13759):名称2
.......................
D /名称 - (13759):名称60
 

下面是我更新code,我现在用的解析JSON数据。

MainActivity.java:更新时间:

 公共类MainActivity扩展AppCompatActivity {

私人工具条工具栏;

私人TextView的tvEmptyView;
私人RecyclerView mRecyclerView;
私人DataAdapter的mAdapter;
私人LinearLayoutManager mLayoutManager;

私人的ArrayList&LT;学生&GT; studentList;

受保护的处理程序处理;

@覆盖
保护无效的onCreate(包savedInstanceState){
    super.onCreate(savedInstanceState);

    的setContentView(R.layout.activity_main);

    工具栏=(栏)findViewById(R.id.toolbar);
    tvEmptyView =(TextView中)findViewById(R.id.empty_view);
    mRecyclerView =(RecyclerView)findViewById(R.id.my_recycler_view);

    studentList =新的ArrayList&LT;学生&GT;();

    处理程序=新的处理程序();
    如果(工具栏!= NULL){
        setSupportActionBar(工具栏);
        getSupportActionBar()的setTitle(机器人生)。
    }

    loadData();

}

//加载初始数据
私人无效loadData(){
    新分析器()执行(http://10.0.2.2/jsons/mytest.txt);
}

一流的解析器扩展的AsyncTask&LT;字符串,太虚,布尔&GT; {

    ProgressDialog对话框;

    @覆盖
    在preExecute保护无效(){
        super.on preExecute();
        对话框=新ProgressDialog(MainActivity.this);
        dialog.show();
        dialog.setCancelable(假);
    }

    @覆盖
    保护布尔doInBackground(字符串...网址){
        尝试 {
            // ------------------&GT;&GT;
            HTTPGET httppost =新HTTPGET(网址[0]);
            HttpClient的HttpClient的=新DefaultHttpClient();
            HTT presponse响应= httpclient.execute(httppost);

            //状态行STAT = response.getStatusLine();
            。INT状态= response.getStatusLine()的getStatus code();

            如果(状态== 200){
                HttpEntity实体= response.getEntity();
                字符串数据= EntityUtils.toString(实体);

                JSONObject的jsono =新的JSONObject(数据);
                JSONArray jarray = jsono.getJSONArray(名称);

                的for(int i = 0; I&LT; jarray.length();我++){
                    的JSONObject对象= jarray.getJSONObject(我);

                    学生演员=新的学生();

                    actor.setName(object.getString(名字));
                    Log.d(的名字 - ,object.getString(名字));

                    studentList.add(演员);
                }

                Log.d(MainActivity:StudentList,大小+ stu​​dentList.size());

                返回true;
            }

            // ------------------&GT;&GT;

        }赶上(ParseException的E1){
            e1.printStackTrace();
        }赶上(IOException异常E){
            e.printStackTrace();
        }赶上(JSONException E){
            e.printStackTrace();
        }
        返回false;

    }

    保护无效onPostExecute(布尔结果){
        dialog.cancel();

        Log.d(MainActivity:StudentList,大小+ stu​​dentList.size());

        ArrayList的&LT;学生&GT; temArray =
                 新的ArrayList&LT;学员GT;(studentList.subList(0,10));
        mAdapter =新的DataAdapter(temArray,mRecyclerView);

        Log.d(MainActivity:TempList,大小+ temArray.size());

        //设置适配器对象的Recyclerview
        mRecyclerView.setAdapter(mAdapter);
        //使用此设置来提高性能,如果你知道的变化
        //内容不改变RecyclerView的布局大小
        mRecyclerView.setHasFixedSize(真正的);

        mLayoutManager =新LinearLayoutManager(MainActivity.this);

        //使用线性布局管理器
        mRecyclerView.setLayoutManager(mLayoutManager);

        如果(studentList.isEmpty()){
            mRecyclerView.setVisibility(View.GONE);
            tvEmptyView.setVisibility(View.VISIBLE);
        } 其他 {
            mRecyclerView.setVisibility(View.VISIBLE);
            tvEmptyView.setVisibility(View.GONE);
        }

        mAdapter.setOnLoadMoreListener(新OnLoadMoreListener(){
            @覆盖
            公共无效onLoadMore(){
                //加空,那么适配器将检查的view_type,并显示在下方的进度条
                studentList.add(空);
                mAdapter.notifyItemInserted(studentList.size() -  1);

                handler.postDelayed(新的Runnable(){
                    @覆盖
                    公共无效的run(){
                        //删除进度项目
                        studentList.remove(studentList.size() -  1);
                        mAdapter.notifyItemRemoved(studentList.size());
                        //逐个添加项目之一
                        INT开始= studentList.size();
                        诠释年底开始= + 10;

                        对于(INT I =启动+ 1; I&LT;结束;我++){
                            mAdapter.notifyItemInserted(studentList.size());
                        }
                        mAdapter.setLoaded();
                       //也可以一次添加所有,但不要忘了打电话给mAdapter.notifyDataSetChanged();
                    }
                },2000);
            }
        });
    }
}

}
 

DataAdapter.java:

 公共类DataAdapter的扩展RecyclerView.Adapter {
    私人最终诠释VIEW_ITEM = 1;
    私人最终诠释VIEW_PROG = 0;

    私人列表&LT;学生&GT; studentList;

    //项目的最低金额低于你的当前滚动位置
    //加载更多了。
    私人诠释visibleThreshold = 5;
    私人诠释lastVisibleItem,totalItemCount;
    私人布尔负荷;
    私人OnLoadMoreListener onLoadMoreListener;

    公众的DataAdapter(名单&LT;学生&GT;的学生,RecyclerView recyclerView){
        studentList =学生;

        如果(recyclerView.getLayoutManager()的instanceof LinearLayoutManager){

            最后LinearLayoutManager linearLayoutManager =(LinearLayoutManager)recyclerView
                    .getLayoutManager();


                    recyclerView
                    .addOnScrollListener(新RecyclerView.OnScrollListener(){
                        @覆盖
                        公共无效onScrolled(RecyclerView recyclerView,
                                               INT DX,诠释DY){
                            super.onScrolled(recyclerView,DX,DY);

                            totalItemCount = linearLayoutManager.getItemCount();
                            lastVisibleItem = linearLayoutManager
                                    .findLastVisibleItemPosition();
                            如果(!装
                                    &功放;&安培; totalItemCount&其中; =(lastVisibleItem + visibleThreshold)){
                                //已到头
                                // 做一点事
                                如果(onLoadMoreListener!= NULL){
                                    onLoadMoreListener.onLoadMore();
                                }
                                加载=真正的;
                            }
                        }
                    });
        }
    }

    @覆盖
    公众诠释getItemViewType(INT位置){
        返回studentList.get(位置)!= NULL? VIEW_ITEM:VIEW_PROG;
    }

    @覆盖
    公共RecyclerView.ViewHolder onCreateViewHolder(ViewGroup中父母,
            INT viewType){
        RecyclerView.ViewHolder VH;
        如果(viewType == VIEW_ITEM){
            视图V = LayoutInflater.from(parent.getContext())。膨胀(
                    R.layout.list_row,父母,假);

            VH =新StudentViewHolder(ⅴ);
        } 其他 {
            视图V = LayoutInflater.from(parent.getContext())。膨胀(
                    R.layout.progress_item,父母,假);

            VH =新ProgressViewHolder(ⅴ);
        }
        返回VH;
    }

    @覆盖
    公共无效onBindViewHolder(RecyclerView.ViewHolder持有人,INT位置){
        如果(持有人的instanceof StudentViewHolder){

            学生singleStudent =(学生)studentList.get(位置);

            ((StudentViewHolder)保持器).tvName.setText(singleStudent.getName());

            ((StudentViewHolder)持有人).student = singleStudent;

        } 其他 {
            ((ProgressViewHolder)持有人).progressBar.setIndeterminate(真正的);
        }
    }

    公共无效setLoaded(){
        装载= FALSE;
    }

    @覆盖
    公众诠释getItemCount(){
        返回studentList.size();
    }

    公共无效setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener){
        this.onLoadMoreListener = onLoadMoreListener;
    }


    //
    公共静态类StudentViewHolder扩展RecyclerView.ViewHolder {
        公众的TextView tvName;

        公益助学的学生;

        公共StudentViewHolder(视图v){
            超级(五);
            tvName =(TextView中)v.findViewById(R.id.tvName);

            v.setOnClickListener(新OnClickListener(){

                @覆盖
                公共无效的onClick(视图v){
                    Toast.makeText(v.getContext(),
                            的OnClick:+ stu​​dent.getName(),
                            Toast.LENGTH_SHORT).show();

                }
            });
        }
    }

    公共静态类ProgressViewHolder扩展RecyclerView.ViewHolder {
        公共进度的进度;

        公共ProgressViewHolder(视图v){
            超级(五);
            进度=(进度)v.findViewById(R.id.progressBar1);
        }
    }
}
 

OnLoadMoreListener.java:

 公共接口OnLoadMoreListener {
     无效onLoadMore();
}
 

解决方案

我有同样的问题,一旦解决了我用这个code吧... 首先..创建这个类

 公共抽象类EndlessOnScrollListener扩展OnScrollListener {

    公共静态字符串变量= EndlessOnScrollListener.class.getSimpleName();

    //使用你的布局管理,而不是
    私人LinearLayoutManager法学硕士;

    公共EndlessOnScrollListener(LinearLayoutManager sglm){
        this.lm =法学硕士;
    }

    @覆盖
    公共无效onScrolled(RecyclerView recyclerView,诠释DX,诠释DY){
        super.onScrolled(recyclerView,DX,DY);

        如果(!recyclerView.canScrollVertically(1)){
            onScrolledToEnd();
        }
    }

    公共抽象无效onScrolledToEnd();
}
 

二。在你活动中使用这种

  recyclerView.addOnScrollListener(新EndlessOnScrollListener(){

    @覆盖
    公共无效onScrolledToEnd(){
        如果(!加载){
            加载=真正的;
            // 10加10 tempList然后通知数据变化
        }
        装载= FALSE;
    }
});
 

这对我的作品....我希望它为你。

I am trying to implement Endless Infinite Scrolling with RecyclerView, but I am only getting first 10 records, not getting next 10 records and even not getting any progress while trying to scroll at bottom.

Whereas I was suppose to get next 10 records on scroll and so on... But getting only first 10 records

Here I have uploaded copy of my JSON - But i am not able to fetch data from same url, that's why i am using client's url and local host.

I am following this tutorial

Here is my complete code, May I know where I am doing mistake ?

JSON :

{
  "names": [
    {
      "name": "Name 1"
    },
    {
      "name": "Name 2"
    },
    ....
    {
      "name": "Name 60"
    }
  ]
}

Log:

D/name -(13759): Name 1
D/name -(13759): Name 2
.......................
D/name -(13759): Name 60

Here is my updated code, which i am using to parse JSON data

MainActivity.java: UPDATED

public class MainActivity extends AppCompatActivity {

private Toolbar toolbar;

private TextView tvEmptyView;
private RecyclerView mRecyclerView;
private DataAdapter mAdapter;
private LinearLayoutManager mLayoutManager;

private ArrayList<Student> studentList;

protected Handler handler;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    toolbar = (Toolbar) findViewById(R.id.toolbar);
    tvEmptyView = (TextView) findViewById(R.id.empty_view);
    mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);

    studentList = new ArrayList<Student>();

    handler = new Handler();
    if (toolbar != null) {
        setSupportActionBar(toolbar);
        getSupportActionBar().setTitle("Android Students");
    }

    loadData();

}

// load initial data
private void loadData() {       
    new Parser().execute("http://10.0.2.2/jsons/mytest.txt");               
}

class Parser extends AsyncTask<String, Void, Boolean> {

    ProgressDialog dialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        dialog = new ProgressDialog(MainActivity.this);
        dialog.show();
        dialog.setCancelable(false);
    }

    @Override
    protected Boolean doInBackground(String... urls) {
        try {
            //------------------>>
            HttpGet httppost = new HttpGet(urls[0]);
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse response = httpclient.execute(httppost);

            // StatusLine stat = response.getStatusLine();
            int status = response.getStatusLine().getStatusCode();

            if (status == 200) {
                HttpEntity entity = response.getEntity();
                String data = EntityUtils.toString(entity);

                JSONObject jsono = new JSONObject(data);
                JSONArray jarray = jsono.getJSONArray("names");

                for (int i = 0; i < jarray.length(); i++) {
                    JSONObject object = jarray.getJSONObject(i);

                    Student actor = new Student();

                    actor.setName(object.getString("name"));
                    Log.d("name - ", object.getString("name"));

                    studentList.add(actor);             
                }

                Log.d("MainActivity:StudentList ", "The size "+studentList.size());                 

                return true;
            }

            //------------------>>

        } catch (ParseException e1) {
            e1.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (JSONException e) {
            e.printStackTrace();
        }
        return false;

    }

    protected void onPostExecute(Boolean result) {
        dialog.cancel();

        Log.d("MainActivity:StudentList ", "The size "+studentList.size());

        ArrayList< Student > temArray = 
                 new ArrayList< Student >(studentList.subList(0, 10));           
        mAdapter = new DataAdapter(temArray, mRecyclerView);

        Log.d("MainActivity:TempList ", "The size "+temArray.size());

        // set the adapter object to the Recyclerview
        mRecyclerView.setAdapter(mAdapter);     
        // 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(MainActivity.this);

        // use a linear layout manager
        mRecyclerView.setLayoutManager(mLayoutManager);

        if (studentList.isEmpty()) {
            mRecyclerView.setVisibility(View.GONE);
            tvEmptyView.setVisibility(View.VISIBLE);
        } else {
            mRecyclerView.setVisibility(View.VISIBLE);
            tvEmptyView.setVisibility(View.GONE);
        }

        mAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                //add null , so the adapter will check view_type and show progress bar at bottom
                studentList.add(null);
                mAdapter.notifyItemInserted(studentList.size() - 1);

                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        //   remove progress item
                        studentList.remove(studentList.size() - 1);
                        mAdapter.notifyItemRemoved(studentList.size());
                        //add items one by one
                        int start = studentList.size();
                        int end = start + 10;

                        for (int i = start + 1; i < end; i++) {
                            mAdapter.notifyItemInserted(studentList.size());
                        }
                        mAdapter.setLoaded();
                       //or you can add all at once but do not forget to call mAdapter.notifyDataSetChanged();
                    }
                }, 2000);
            }
        });
    }
}

}

DataAdapter.java:

public class DataAdapter extends RecyclerView.Adapter {
    private final int VIEW_ITEM = 1;
    private final int VIEW_PROG = 0;

    private List<Student> studentList;

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

    public DataAdapter(List<Student> students, RecyclerView recyclerView) {
        studentList = students;

        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 studentList.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.list_row, parent, false);

            vh = new StudentViewHolder(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 StudentViewHolder) {

            Student singleStudent= (Student) studentList.get(position);

            ((StudentViewHolder) holder).tvName.setText(singleStudent.getName());

            ((StudentViewHolder) holder).student= singleStudent;

        } else {
            ((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
        }
    }

    public void setLoaded() {
        loading = false;
    }

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

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


    //
    public static class StudentViewHolder extends RecyclerView.ViewHolder {
        public TextView tvName;     

        public Student student;

        public StudentViewHolder(View v) {
            super(v);
            tvName = (TextView) v.findViewById(R.id.tvName);

            v.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    Toast.makeText(v.getContext(),
                            "OnClick :" + student.getName(),
                            Toast.LENGTH_SHORT).show();

                }
            });
        }
    }

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

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

OnLoadMoreListener.java:

public interface OnLoadMoreListener {
     void onLoadMore();
}

解决方案

I had the same issue once an I solve it using this code ... First .. create this class

public abstract class EndlessOnScrollListener extends OnScrollListener {

    public static String TAG = EndlessOnScrollListener.class.getSimpleName();

    // use your LayoutManager instead
    private LinearLayoutManager llm;

    public EndlessOnScrollListener(LinearLayoutManager sglm) {
        this.lm = llm;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);

        if (!recyclerView.canScrollVertically(1)) {
            onScrolledToEnd();
        }
    }

    public abstract void onScrolledToEnd();
}

Second .. in you activity use this

recyclerView.addOnScrollListener(new EndlessOnScrollListener() {

    @Override
    public void onScrolledToEnd() {
        if (!loading) {
            loading = true;
            // add 10 by 10 to tempList then notify changing in data
        }
        loading = false;
    }
});

This works for me .... I hope it works for you to.

这篇关于RecyclerView无尽无限滚动发行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆