RecyclerView无尽无限滚动发行 [英] RecyclerView Endless Infinite Scrolling Issue
问题描述
我想实现无尽无限滚动与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,大小+ studentList.size());
返回true;
}
// ------------------&GT;&GT;
}赶上(ParseException的E1){
e1.printStackTrace();
}赶上(IOException异常E){
e.printStackTrace();
}赶上(JSONException E){
e.printStackTrace();
}
返回false;
}
保护无效onPostExecute(布尔结果){
dialog.cancel();
Log.d(MainActivity:StudentList,大小+ studentList.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:+ student.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屋!