如何从服务器在回收站视图中加载更多数据? [英] How to load more data in recycler view from server?

查看:27
本文介绍了如何从服务器在回收站视图中加载更多数据?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个回收器视图,当用户滚动到底部时我从服务器加载一些数据我想显示一个进度条并向服务器发送另一个请求以获取更多数据.我试过下面的代码,但它无法从服务器加载更多数据.请帮忙

I have a recycler view in which I load some data from the server when user scroll to bottom I want to show a progress bar and send another request to the server for more data. I have tried below code but it not able to load more data from the server. please help

   private RecyclerView mRecyclerView;
    private List<User> mUsers = new ArrayList<>();
    private UserAdapter mUserAdapter;
    private static String sz_RecordCount;
    private static String sz_LastCount;
    private final int m_n_DefaultRecordCount = m_kDEFAULT_RECORD_COUNT;
    private static final int m_kDEFAULT_RECORD_COUNT = 5;
    private ArrayList<CDealAppDatastorage> s_oDataset;
    private String TAG = MainActivity.class.getSimpleName();
    private CDealAppDatastorage item;
    private static int arrayCount;
    private Context context;
    private PreferenceHelper m_oPreferenceHelper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        context = MainActivity.this;
        m_oPreferenceHelper = new PreferenceHelper(context);

        sz_RecordCount = String.valueOf(m_n_DefaultRecordCount);// increment of record count
        int intialLastCount = 0;
        sz_LastCount = String.valueOf(intialLastCount);// increment of last count...

        s_oDataset = new ArrayList<>();// making object of Arraylist
        //initial request for data
        initalDealListing();


        mRecyclerView = (RecyclerView) findViewById(R.id.recycleView);

        mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
        mUserAdapter = new UserAdapter();


        mUserAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                Log.e("haint", "Load More");
                mUsers.add(null);
                mUserAdapter.notifyItemInserted(mUsers.size() - 1);

                //Load more data for reyclerview
                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Log.e("haint", "Load More 2");


                        //Remove loading item
                        mUsers.remove(mUsers.size() - 1);
                        mUserAdapter.notifyItemRemoved(mUsers.size());
                        //sending request to server for more data
                        moreDealsRequest();

                        mUserAdapter.notifyDataSetChanged();
                        mUserAdapter.setLoaded();
                    }
                }, 5000);
            }
        });
    }

    private void initalDealListing() {
        String m = "9565656565";
        String p = "D55A8077E0208A5C5B25176608EF84BD";
        // 3. build jsonObject
        try {
            final JSONObject jsonObject = new JSONObject();// making object of Jsons.
            jsonObject.put("agentCode", m.trim());// put mobile number
            jsonObject.put("pin", p.trim());// put password
            jsonObject.put("recordcount", sz_RecordCount.trim());// put record count
            jsonObject.put("lastcountvalue", sz_LastCount.trim());// put last count
            Log.e("CAppList:", sz_RecordCount);
            Log.e("Capplist:", sz_LastCount);
            Log.d(TAG, "Server Request:-" + jsonObject.toString());
            final String m_DealListingURL = APIStorage.IREWARDS_URL + APIStorage.DEALLISTING_URL;
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, m_DealListingURL, jsonObject, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.d(TAG, "Server Response:-" + response);

                    try {
                        int nResultCodeFromServer = Integer.parseInt(response.getString(ServerResponseStorage.s_szRESULT_CODE));
                        if (nResultCodeFromServer == ConstantInt.m_kTRANSACTION_SUCCESS) {

                            JSONArray posts = response.optJSONArray(ServerResponseStorage.s_szDEAL_ARRAY);// get Deal list in array from response
                            s_oDataset.clear();
                            for (int i = 0; i < posts.length(); i++) {// loop for counting deals from server
                                try {
                                    JSONObject post = posts.getJSONObject(i);// counting deal based on index
                                    item = new CDealAppDatastorage();// creating object of DealAppdata storage
                                    item.setM_szHeaderText(post.getString(ServerResponseStorage.s_szDEAL_NAME));// get deal name from response
                                    item.setM_szsubHeaderText(post.getString(ServerResponseStorage.s_szDEAL_CODE));// get dealcode from response
                                    s_oDataset.add(item);// add all items in ArrayList
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }
                            arrayCount = posts.length();
                            Log.d(TAG, "ArrayCount::" + arrayCount);
                            /*here we are storing no. of deals coming from server*/
                            // write
                            m_oPreferenceHelper.saveIntegerValue("LastCountLength", arrayCount);
                            if (!s_oDataset.isEmpty()) {// condition if data in arraylist is not empty
                                mRecyclerView.setAdapter(mUserAdapter);
                            }


                        }

                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d(TAG, "Server error:-" + error);
                }
            });
            RequestQueue requestQueue = Volley.newRequestQueue(context);
            jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(ConstantInt.INITIAL_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            requestQueue.add(jsonObjectRequest);
        } catch (JSONException e) {
            e.printStackTrace();
        }

    }

    /*This method send request to server for more deals*/
    private void moreDealsRequest() {
        try {
            // 3. build jsonObject
            final JSONObject jsonObject = new JSONObject();// making object of Jsons.
            jsonObject.put(ServerRequestKeyStorage.s_szAGENT_CODE, "9565656565");// put mobile number
            jsonObject.put(ServerRequestKeyStorage.s_szPASSWORD, "D55A8077E0208A5C5B25176608EF84BD");// put password
            jsonObject.put(ServerRequestKeyStorage.s_szRECORD_COUNT, sz_RecordCount.trim());// put record count
            jsonObject.put(ServerRequestKeyStorage.s_szLAST_COUNT, sz_LastCount.trim());// put last count
            Log.e("CAppList:", sz_RecordCount);
            Log.e("Capplist:", sz_LastCount);
            // 4. convert JSONObject to JSON to String

            Log.e(TAG, "Server Request:-" + jsonObject.toString());
            RequestQueue requestQueue = Volley.newRequestQueue(context);
            final String imgPath = APIStorage.IREWARDS_URL + APIStorage.DEAL_IMAGE_PATH;
            final String m_DealListingURL = APIStorage.IREWARDS_URL + APIStorage.DEALLISTING_URL;
            JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, m_DealListingURL, jsonObject, new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.e(TAG, "Server Response:-" + response);
                    try {
                        int nResultCodeFromServer = Integer.parseInt(response.getString(ServerResponseStorage.s_szRESULT_CODE));

                        if (nResultCodeFromServer == ConstantInt.m_kTRANSACTION_SUCCESS) {
                            // Select the last row so it will scroll into view...
                            JSONArray posts = response.optJSONArray(ServerResponseStorage.s_szDEAL_ARRAY);// GETTING DEAL LIST
                            for (int i = 0; i < posts.length(); i++) {
                                try {
                                    JSONObject post = posts.getJSONObject(i);// GETTING DEAL AT POSITION AT I
                                    item = new CDealAppDatastorage();// object create of DealAppdatastorage
                                    item.setM_szHeaderText(post.getString(ServerResponseStorage.s_szDEAL_NAME));//getting deal name
                                    item.setM_szsubHeaderText(post.getString(ServerResponseStorage.s_szDEAL_CODE));// getting deal code
                                    s_oDataset.add(item);
                                } catch (Exception e) {
                                    e.printStackTrace();
                                }
                            }

                        }


                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
            }, new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.d(TAG, "Server Error::" + error);
                }
            });
            jsonObjectRequest.setRetryPolicy(new DefaultRetryPolicy(ConstantInt.INITIAL_TIMEOUT_MS, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT));
            requestQueue.add(jsonObjectRequest);
        } catch (JSONException e) {
            e.printStackTrace();
        }
    }

    static class UserViewHolder extends RecyclerView.ViewHolder {
        public TextView tvName;
        public TextView tvEmailId;

        public UserViewHolder(View itemView) {
            super(itemView);
            tvName = (TextView) itemView.findViewById(R.id.tvName);

            tvEmailId = (TextView) itemView.findViewById(R.id.tvEmailId);
        }
    }

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

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

    class UserAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

        private final int VIEW_TYPE_ITEM = 0;
        private final int VIEW_TYPE_LOADING = 1;

        private OnLoadMoreListener mOnLoadMoreListener;

        private boolean isLoading;
        private int visibleThreshold = 5;
        private int lastVisibleItem, totalItemCount;

        public UserAdapter() {
            final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();
            mRecyclerView.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 (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                        if (mOnLoadMoreListener != null) {
                            mOnLoadMoreListener.onLoadMore();
                        }
                        isLoading = true;
                    }
                }
            });
        }

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

        @Override
        public int getItemViewType(int position) {
            return s_oDataset.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
        }

        @Override
        public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            if (viewType == VIEW_TYPE_ITEM) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_user_item, parent, false);
                return new UserViewHolder(view);
            } else if (viewType == VIEW_TYPE_LOADING) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.layout_loading_item, parent, false);
                return new LoadingViewHolder(view);
            }
            return null;
        }

        @Override
        public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
            if (holder instanceof UserViewHolder) {
                CDealAppDatastorage user = s_oDataset.get(position);
                UserViewHolder userViewHolder = (UserViewHolder) holder;
                userViewHolder.tvName.setText(user.getM_szHeaderText());
                userViewHolder.tvEmailId.setText(user.getM_szsubHeaderText());
            } else if (holder instanceof LoadingViewHolder) {
                LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
                loadingViewHolder.progressBar.setIndeterminate(true);
            }
        }

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

        public void setLoaded() {
            isLoading = false;
        }
    }
}

推荐答案

太晚了,但我也用同样的方式检查我的代码,它对我有用

Too late but i'm also refer same way check with my code it work for me

这是使用改造的 API 调用并获取 listnotifications 然后在此方法中我为 loadmore 创建了另一个方法 getMoreNotificationListApiCall()

Here is API call using retrofit and get listnotifications then in this method i create one more method for loadmore getMoreNotificationListApiCall()

public void getNotification()
 {
    if (listnotifications.size() > 0) {
                                        notificationListAdapter = new NotificationListAdapter(NotificationListActivity.this, listnotifications, notificationListRecyclerview);
                                        notificationListRecyclerview.setAdapter(notificationListAdapter);

                                        notificationListAdapter.setOnLoadMoreListener(new OnLoadMoreListener() {
                                            @Override
                                            public void onLoadMore() {
                                                Log.e("ad", "Load More");

                                                listnotifications.add(null);

                                                Handler handler = new Handler();
                                                final Runnable r = new Runnable() {
                                                    public void run() {
                                                        if (listnotifications.size()>0) {
                                                            notificationListAdapter.notifyItemInserted(listnotifications.size() - 1);
                                                        }
                                                    }
                                                };
                                                handler.post(r);

                                                try {

                                                    if (CommonUtils.isConnectingToInternet(NotificationListActivity.this)) {
                                                        // Internet Connection is Present
                                                        getMoreNotificationListApiCall();

                                                    } else {
                                                        //Remove loading item
                                                        if (listnotifications.size()>0) {
                                                            listnotifications.remove(listnotifications.size() - 1);
                                                        }

                                                        notificationListAdapter.notifyItemRemoved(listnotifications.size());
                                                        CommonUtils.commonToast(NotificationListActivity.this, getResources().getString(R.string.no_internet_exist));
                                                    }

                                                } catch (Exception e) {
                                                    // TODO Auto-generated catch block
                                                    e.printStackTrace();
                                                }

                                            }
                                        });


                                    }

    }

getMoreNotificationListApiCall() 此方法中的方法代码我增加 startlimit 表示页面索引并删除 null(我正在使用 retorfit 进行 api 调用)

getMoreNotificationListApiCall() method code in this method i increment startlimit means page index and remove null (i'm using retorfit for api call)

private void getMoreNotificationListApiCall() {
    try {
        if (CommonUtils.isConnectingToInternet(NotificationListActivity.this)) {

            StartLimit = StartLimit + 10;

            Call<NotificationBase> call = ApiHandler.getApiService().getNotificationListApi(notificationListJsonMap());

            call.enqueue(new Callback<NotificationBase>() {
                @Override
                public void onResponse(Call<NotificationBase> registerCall, Response<NotificationBase> response) {
                    Log.e(TAG, " Full json gson => " + "Hi i am here");
                    try {
                        Log.e(TAG, " Full json gson => " + new Gson().toJson(response));
                        JSONObject jsonObj = new JSONObject(new Gson().toJson(response).toString());
                        Log.e(TAG, " responce => " + jsonObj.getJSONObject("body").toString());

                        if (response.isSuccessful()) {
                            int success = response.body().getSuccess();
                            if (success == 1) {

                                List<NotificationBean> moreNotication = response.body().getNotificatons();

                                //Remove loading item
                                if (listnotifications.size() > 0) {
                                    listnotifications.remove(listnotifications.size() - 1);
                                }

                                notificationListAdapter.notifyItemRemoved(listnotifications.size());

                                for (int i = 0; i < moreNotication.size(); i++) {
                                    listnotifications.add(moreNotication.get(i));
                                }

                                notificationListAdapter.notifyDataSetChanged();
                                notificationListAdapter.setLoaded();


                            } else if (success == 0) {
                                if (listnotifications.size() > 0) {
                                    listnotifications.remove(listnotifications.size() - 1);
                                }
                                notificationListAdapter.notifyItemRemoved(listnotifications.size());

                            } else {
                                if (listnotifications.size() > 0) {
                                    listnotifications.remove(listnotifications.size() - 1);
                                }
                                notificationListAdapter.notifyItemRemoved(listnotifications.size());

                            }
                        } else {
                            if (listnotifications.size() > 0) {
                                listnotifications.remove(listnotifications.size() - 1);
                            }
                            notificationListAdapter.notifyItemRemoved(listnotifications.size());
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                        try {
                            Log.e(TAG, "error=" + e.toString());
                            if (listnotifications.size() > 0) {
                                listnotifications.remove(listnotifications.size() - 1);
                            }
                            notificationListAdapter.notifyItemRemoved(listnotifications.size());
                        } catch (Resources.NotFoundException e1) {
                            e1.printStackTrace();
                        }

                    }
                }

                @Override
                public void onFailure(Call<NotificationBase> call, Throwable t) {
                    try {
                        Log.e(TAG, "error" + t.toString());
                        if (listnotifications.size() > 0) {
                            listnotifications.remove(listnotifications.size() - 1);
                        }
                        notificationListAdapter.notifyItemRemoved(listnotifications.size());
                    } catch (Resources.NotFoundException e) {
                        e.printStackTrace();
                    }
                }
            });
        } else {
            CommonUtils.commonToast(NotificationListActivity.this, getResources().getString(R.string.no_internet_exist));

        }
    } catch (Resources.NotFoundException e) {
        e.printStackTrace();
    }
}

这是我的适配器类,我在其中实现了 OnLoadMoreListener

public class NotificationListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {


public static List<NotificationBean> mList;
private final int VIEW_TYPE_ITEM = 0;
private final int VIEW_TYPE_LOADING = 1;
FragmentActivity mFragmentActivity;

private OnLoadMoreListener mOnLoadMoreListener;
private boolean isLoading;
private int visibleThreshold = 5;
private int lastVisibleItem, totalItemCount;

public NotificationListAdapter(FragmentActivity fragmentActivity, List<NotificationBean> data, RecyclerView mRecyclerView) {
    this.mList = data;
    this.mFragmentActivity = fragmentActivity;

    final LinearLayoutManager linearLayoutManager = (LinearLayoutManager) mRecyclerView.getLayoutManager();

    mRecyclerView.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 (!isLoading && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                if (mOnLoadMoreListener != null) {
                    mOnLoadMoreListener.onLoadMore();
                }
                isLoading = true;
            }
        }
    });
}

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


@Override
public int getItemViewType(int position) {
    return mList.get(position) == null ? VIEW_TYPE_LOADING : VIEW_TYPE_ITEM;
}

public void delete(int position) { //removes the row
    Log.e("Position : ", "" + position);
    mList.remove(position);
    notifyItemRemoved(position);
    notifyItemRangeChanged(position, mList.size());

}




// Return the size arraylist
@Override
public int getItemCount() {
    return mList == null ? 0 : mList.size();
}

public void setLoaded() {
    isLoading = false;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == VIEW_TYPE_ITEM) {
        // create a new view
        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.item_notification_list, parent, false);

        return new ViewHolder(itemLayoutView);
    } else if (viewType == VIEW_TYPE_LOADING) {

        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(
                R.layout.loading_layout, parent, false);

        return new LoadingViewHolder(itemLayoutView);
    }
    return null;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
    if (holder instanceof ViewHolder) {

        try {

            final ViewHolder viewHolder = (ViewHolder) holder;
            viewHolder.singleBean = mList.get(position);
            viewHolder.pos = position;
            final NotificationBean list = mList.get(position);


            String notificationTitle = list.getMessage();
            String notificationTimeDate = list.getCreatedDatetime();

            String notificationIsRead = list.getIsRead();

        } catch (Exception e) {
            e.printStackTrace();
        }
    } else if (holder instanceof LoadingViewHolder) {
        LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
        loadingViewHolder.progressBar.setIndeterminate(true);
    }


}

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

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

public class ViewHolder extends RecyclerView.ViewHolder {


    public NotificationBean singleBean;
    int pos;

    TextView txt_notification_time_date;
    CustomTextview checkbox_notification;
    RelativeLayout rl_row_background;

    public ViewHolder(final View v) {
        super(v);

        checkbox_notification = (CustomTextview) v.findViewById(R.id.checkbox_notification);
        //checkbox_notification.setButtonDrawable(android.R.color.transparent);//custom_checkbox

        // txt_notification_title= (TextView) v.findViewById(R.id.txt_notification_title);
        txt_notification_time_date = (TextView) v.findViewById(R.id.txt_notification_time_date);
        rl_row_background = (RelativeLayout) v.findViewById(R.id.rl_row_background);


    }
}
public void refreshAdapter() {
    notifyDataSetChanged();
}



 }

这里是xml文件loading_layout.xml

 <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_gravity="center_horizontal"
    android:gravity="center_horizontal"
    android:orientation="vertical">
    <ProgressBar
        android:id="@+id/progressBar1"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" android:layout_marginBottom="5dp"
        android:layout_marginTop="5dp"
        android:indeterminate="true" />

</LinearLayout>

这篇关于如何从服务器在回收站视图中加载更多数据?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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