0
Ich versuche Endless Infinite Scrolling mit RecyclerView zu implementieren, aber ich bekomme nur alle Datensätze und auch keinen Fortschritt beim Versuch, im unteren Bereich zu scrollen.RecyclerViewPagination Endless Infinite Scrolling Problem
dies News_Fragment
public class News_Fragment extends Fragment {
private List<News> newsList = new ArrayList<>();
private TextView textView;
private RecyclerView recyclerView;
private NewsAdapter newAdapter;
private ProgressBar mProgressBar;
protected Handler handler;
public News news;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_news_, container, false);
loadData();
handler = new Handler();
recyclerView = (RecyclerView) rootView.findViewById(R.id.News_recycler_view);
textView = (TextView)rootView.findViewById(R.id.empty_view);
mProgressBar = (ProgressBar) rootView.findViewById(R.id.progressBar);
//recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
recyclerView.setHasFixedSize(true);
final LinearLayoutManager mLayoutManager = new LinearLayoutManager(getActivity());
recyclerView.setLayoutManager(mLayoutManager);
recyclerView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST));
recyclerView.setItemAnimator(new DefaultItemAnimator());
recyclerView.setAdapter(newAdapter);
newAdapter = new NewsAdapter(newsList,recyclerView);
if(newsList.isEmpty()){
recyclerView.setVisibility(View.GONE);
textView.setVisibility(View.VISIBLE);
}else {
recyclerView.setVisibility(View.VISIBLE);
textView.setVisibility(View.GONE);
}
newAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
@Override
public void onLoadMore() {
//add null , so the adapter will check view_type and show progress bar at bottom
newsList.add(null);
newAdapter.notifyItemInserted(newsList.size() - 1);
handler.postDelayed(new Runnable(){
@Override
public void run() {
//remove progress item
newsList.remove(newsList.size() - 1);
newAdapter.notifyItemRemoved(newsList.size());
//add items one bye one
int start = newsList.size();
int end = start + 5;
for (int i = start + 1;i <= end ; i++) {
newsList.add(new News("skip"+start,"limit"+end));
newAdapter.notifyItemInserted(newsList.size());
}
newAdapter.setLoaded();
}
},2000);
}
});
JSONObject jsonObject = new JSONObject();
try {
jsonObject.put("skip",0);
jsonObject.put("limit",50);
} catch (JSONException e) {
e.printStackTrace();
}
new NewsTask() {
@Override
protected void onPostExecute(APIResponse apiResponse) {
if (apiResponse != null && apiResponse.data != null & apiResponse.data.size() > 0) {
newsList = apiResponse.data;
//newAdapter.notifyDataSetChanged();
newAdapter = new NewsAdapter(newsList,recyclerView);
recyclerView.setAdapter(newAdapter);
}
Log.i("resp", "onPostExecute");
//Hide progressbar
mProgressBar.setVisibility(View.GONE);
}
}.execute(jsonObject);
mProgressBar.setVisibility(View.VISIBLE);
return rootView;
}
//load initial data
private void loadData(){
int start = newsList.size();
int end = start + 5;
for (int i = 1;i<=10;i++){
News news = new News("skip"+i,"limit"+i);
newsList.add(0,news);
}
}
dies NewsTask
public class NewsTask extends AsyncTask<JSONObject, Integer, APIResponse>{
ProgressDialog dialog;
OkHttpClient client = new OkHttpClient();
Gson gson = new Gson();
private ProgressBar mProgressBar;
Context context;
@Override
protected APIResponse doInBackground(JSONObject... params) {
// http://bitstobyte.in/api/news
// strat 0
// end 10
JSONObject jsonObject = params[0];
try {
String skip = jsonObject.getString("skip");
String limit = jsonObject.getString("limit");
String url = "http://bitstobyte.in/api/news?query={%22skip%22:"+skip+",%22limit%22:"+limit+"}";
Request request = new Request.Builder().url(url).build();
Response response = client.newCall(request).execute();
if(!response.isSuccessful()){
Log.v("answer","failed"+response.code());
throw new IOException("UnExpected code"+response);
}
String strResponse = response.body().string();
Log.d("News_Response",strResponse);
MainResponse mainResponse = gson.fromJson(strResponse,MainResponse.class);
// deserialze and return.
return mainResponse.msg;
}catch (IOException e) {
Log.e("searchTask",e.toString());
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
}
dies NewsAdapter
public class NewsAdapter extends RecyclerView.Adapter {
private final int VIEW_ITEM = 1;
private final int VIEW_PROG = 0;
private List<News> newsList;
private Context context;
// 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 NewsAdapter(List<News> newsList , RecyclerView recyclerView){
this.newsList = newsList;
this.context = context;
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 void onScrollStateChanged(RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
// When went to the end of the list, load more posts
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
if (linearLayoutManager.findLastVisibleItemPosition() >= linearLayoutManager.getItemCount() - 1) {
// Grow List
}
}
}
});
}
}
@Override
public int getItemViewType(int position){
return newsList.get(position) instanceof News ? 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.news_list_row, parent, false);
vh = new MyViewHolder(v);
} else {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.progress_item, parent, false);
vh = new ProgressViewHolder(v);
}
return vh;
}
public class MyViewHolder extends RecyclerView.ViewHolder {
public TextView title;
public ImageView image,nextArrowimage;
public TextView desc;
private News news;
public MyViewHolder(View view) {
super(view);
title = (TextView) view.findViewById(R.id.News_title);
image = (ImageView) view.findViewById(R.id.News_imageView);
nextArrowimage = (ImageView)view.findViewById(R.id.news_NextArrow);
desc = (TextView) view.findViewById(R.id.News_desc);
view.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String title = news.getTitle();
String desc = news.getDesc();
String image = "http://bitstobyte.in/upload/"+news.getImage();
Intent intent = new Intent(context, News_Activity.class);
intent.putExtra("title", title);
intent.putExtra("desc",desc);
intent.putExtra("imageUrl", image);
context.startActivity(intent);
Toast.makeText(v.getContext(), "OnClick :" + news.getTitle() + " \n "+news.getImage(),Toast.LENGTH_SHORT).show();
}
});
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder,int position){
if (holder instanceof MyViewHolder) {
final News single_news= (News) newsList.get(position);
((MyViewHolder) holder).title.setText(single_news.getTitle());
((MyViewHolder) holder).desc.setText(single_news.getDesc());
((MyViewHolder) holder).nextArrowimage.setImageResource(R.drawable.nextblackbutton);
context = ((MyViewHolder) holder).image.getContext();
Picasso.with(context).load("http://bitstobyte.in/upload/"+single_news.getImage()).placeholder(R.drawable.ic_favorite_white_24dp).error(R.drawable.ic_map_24dp).resize(100,100).into(((MyViewHolder) holder).image);
((MyViewHolder) holder).news= single_news;
} else {
((ProgressViewHolder) holder).progressBar.setIndeterminate(true);
}
}
public void setLoaded() {
loading = false;
}
@Override
public int getItemCount() {
return newsList.size();
}
public void setOnLoadMoreListener(OnLoadMoreListener onLoadMoreListener) {
this.onLoadMoreListener = onLoadMoreListener;
}
public static class ProgressViewHolder extends RecyclerView.ViewHolder {
public ProgressBar progressBar;
public ProgressViewHolder(View v) {
super(v);
progressBar = (ProgressBar) v.findViewById(R.id.progressBar1);
}
}
}
dies Json Daten
{
"status": "ok",
"msg": {
"current": 58,
"total": 58,
"data": [{
"title": "dfdsfsdf",
"machineId": "1bc99f0a-f138-428b-9b54-5531e4c8fc3f",
"image": "55a88fbfbc54f41570840e11.jpg",
"partnerId": "558be1a2e1d33656b06ddbd7",
"_id": "55a88fbfbc54f41570840e11",
"desc": "fsfsdfdsfdsf"
}, {
"title": "one more test",
"machineId": "1bc99f0a-f138-428b-9b54-5531e4c8fc3f",
"image": "55a8901abc54f41570840e12.jpg",
"partnerId": "558be1a2e1d33656b06ddbd7",
"_id": "55a8901abc54f41570840e12",
"desc": "good.."
},
ich habe den Code geändert .... aber funktioniert nicht –
Ich habe bearbeiten onBindViewHolder getItemType @kranthikumar –
Ich habe diesen Fehler : java.lang.NullPointerException: Versuch, die virtuelle Methode 'java.lang.String com.example.shilpa.churchcms.models.News.getTitle()' für eine Nullobjekt-Referenz aufzurufen –