如何在android的Recyclerview中加载更多Jsons数据

如何在android的Recyclerview中加载更多Jsons数据,android,Android,我正在使用recyclerview,其中我希望使用json从服务器获取更多数据。 场景是这样的:-在第一次点击时,我想在列表中显示5页,当用户在第二次点击时,在recyclerview下面显示更多按钮显示5页。我怎么做 这是我的密码 public class MainActivity extends AppCompatActivity { public static String m_DealListingURL = "http://9992.1999.0.110:8080/ireward/r

我正在使用recyclerview,其中我希望使用json从服务器获取更多数据。 场景是这样的:-在第一次点击时,我想在列表中显示5页,当用户在第二次点击时,在recyclerview下面显示更多按钮显示5页。我怎么做

这是我的密码

public class MainActivity extends AppCompatActivity {

public static String m_DealListingURL = "http://9992.1999.0.110:8080/ireward/rest/json/metallica/getDealListInJSON";
public static String s_szresult = " ";
public Handler m_Handler;
private Toolbar mToolbar;
private RecyclerView mRecyclerView;
private List<User> mUsers = new ArrayList<>();
private UserAdapter mUserAdapter;
//declare boolean
private CJsonsResponse m_oJsonsResponse;
private JSONObject m_oResponseobject;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mToolbar = (Toolbar) findViewById(R.id.toolbar);
    mToolbar.setTitle("LoadMoreRecycleView");

    new CDealDataSent().execute(m_DealListingURL);

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

    mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
    m_Handler = new Handler();
    mUserAdapter = new UserAdapter();// create adapter object and add arraylist to adapter

    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());

                    //Load data
                    int index = mUsers.size();
                    int end = index + 20;
                    for (int i = index; i < end; i++) {
                        User user = new User();
                        user.setName("Name " + i);
                        user.setEmail("alibaba" + i + "@gmail.com");
                        mUsers.add(user);
                    }
                    mUserAdapter.notifyDataSetChanged();
                    mUserAdapter.setLoaded();
                }
            }, 5000);
        }
    });
}

//sending deal data to retreive response from server
public String DealListing(String url, CRegistrationDataStorage login) {
    InputStream inputStream = null;
    m_oJsonsResponse = new CJsonsResponse();
    try {
        // 1. create HttpClient
        HttpClient httpclient = new DefaultHttpClient();
        // 2. make POST request to the given URL
        HttpPost httpPost = new HttpPost(url);
        String json = "";
        // 3. build jsonObject
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("agentCode", "7777777776");
        jsonObject.put("pin", "38F629170AC3AB74B9D6D2CC411C2F3C");
        jsonObject.put("recordcount", "5");
        jsonObject.put("lastcountvalue", "0");
        //jsonObject.put("emailId", "nirajk1190@gmail.com");
        // 4. convert JSONObject to JSON to String
        json = jsonObject.toString();
        // 5. set json to StringEntity
        StringEntity se = new StringEntity(json);
        // 6. set httpPost Entity
        httpPost.setEntity(se);
        // 7. Set some headers to inform server about the type of the content
        httpPost.setHeader("Content-type", "application/json");
        // 8. Execute POST request to the given URL
        HttpResponse httpResponse = httpclient.execute(httpPost);
        HttpEntity entity = httpResponse.getEntity();
        // 9. receive response as inputStream
        inputStream = entity.getContent();
        System.out.println("InputStream....:" + inputStream.toString());
        System.out.println("Response....:" + httpResponse.toString());

        StatusLine statusLine = httpResponse.getStatusLine();
        System.out.println("statusLine......:" + statusLine.toString());
        ////Log.d("resp_body", resp_body.toString());
        int statusCode = statusLine.getStatusCode();
        // 10. convert inputstream to string
        if (statusCode == 200) {
            // 10. convert inputstream to string
            if (inputStream != null)
                s_szresult = m_oJsonsResponse.convertInputStreamToString(inputStream);
            //String resp_body =
            EntityUtils.toString(httpResponse.getEntity());
        } else
            s_szresult = "Did not work!";
    } catch (Exception e) {
        Log.d("InputStream", e.getLocalizedMessage());
    }
    System.out.println("resul.....:" + s_szresult);
    // 11. return s_szResult
    return s_szresult;
}

public void getResponse() throws JSONException {// getting response from serevr ..................
    if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Transaction Successful")) {// server based condition

        mRecyclerView.setAdapter(mUserAdapter);//adding adapter to recyclerview
    } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Connection Not Available")) {//server based conditions
        Toast.makeText(MainActivity.this, "Connection not avaliable", Toast.LENGTH_SHORT).show();
    } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Deal List Not Found")) {// serevr based conditions .....
        Toast.makeText(MainActivity.this, "No more deals", Toast.LENGTH_SHORT).show();
        ;
    }
}

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 mUsers.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) {
            User user = mUsers.get(position);
            UserViewHolder userViewHolder = (UserViewHolder) holder;
            userViewHolder.tvName.setText(user.getName());
            userViewHolder.tvEmailId.setText(user.getEmail());
        } else if (holder instanceof LoadingViewHolder) {
            LoadingViewHolder loadingViewHolder = (LoadingViewHolder) holder;
            loadingViewHolder.progressBar.setIndeterminate(true);
        }
    }

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

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

//  sending deal data to server and retreive response......
class CDealDataSent extends AsyncTask<String, Void, String> {
    public CRegistrationDataStorage oRegisterStorage;
    public User item;
    public ProgressDialog pDialog;

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        pDialog = new ProgressDialog(MainActivity.this);

        //pDialog.getWindow().setBackgroundDrawableResource(R.color.trans);

        pDialog.setMessage("Processing ...");
        //pDialog.setIndeterminate(false);
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected String doInBackground(String... urls) {
        return DealListing(urls[0], oRegisterStorage);// sending data to server...

    }

    // onPostExecute displays the results of the AsyncTask.
    @Override
    protected void onPostExecute(final String result) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                m_Handler.post(new Runnable() {
                    @Override
                    public void run() {
                        pDialog.dismiss();
                        try {
                            m_oResponseobject = new JSONObject(result);// getting response from server
                            JSONArray posts = m_oResponseobject.optJSONArray("dealList");

                            mUsers = new ArrayList<User>();
                            for (int i = 0; i < posts.length(); i++) {
                                JSONObject post = posts.getJSONObject(i);
                                item = new User();
                                item.setEmail(post.getString("dealname"));
                                item.setName(post.getString("dealcode"));
                                mUsers.add(item);

                            }
                            getResponse();
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                    }
                });
            }
        }).start();

    }
}
public类MainActivity扩展了AppCompatActivity{
公共静态字符串m_DealListingURL=”http://9992.1999.0.110:8080/ireward/rest/json/metallica/getDealListInJSON";
公共静态字符串s_szresult=“”;
公共处理器m_处理器;
私有工具栏mToolbar;
私人回收视图mRecyclerView;
私有列表mUsers=newarraylist();
专用用户适配器;
//声明布尔值
私人CJsonsResponse m_OJSONS Response;
私有JSONObject m_或响应对象;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mToolbar=(工具栏)findviewbyd(R.id.Toolbar);
mToolbar.setTitle(“LoadMoreRecycleView”);
新建CDealDataSent().execute(m_DealListingURL);
mRecyclerView=(RecyclerView)findViewById(R.id.recycleView);
mRecyclerView.setLayoutManager(新的LinearLayoutManager(this));
m_Handler=新处理程序();
mUserAdapter=newuseradapter();//创建适配器对象并将arraylist添加到适配器
setOnLoadMoreListener(新的OnLoadMoreListener()){
@凌驾
public void onLoadMore(){
Log.e(“haint”,“加载更多”);
添加(空);
mUserAdapter.notifyItemInserted(mUsers.size()-1);
//为ReyclView加载更多数据
new Handler().postDelayed(new Runnable()){
@凌驾
公开募捐{
Log.e(“haint”,“加载更多2”);
//删除加载项
移除(mUsers.size()-1);
mUserAdapter.notifyItemRemoved(mUsers.size());
//加载数据
int index=mUsers.size();
int end=指数+20;
for(int i=索引;imUserAdapter.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());

                    // instead off this I want to hit second time to server to get more data ...here
                    int index = mUsers.size();
                    int end = index + 20;
                    for (int i = index; i < end; i++) {
                        User user = new User();
                        user.setName("Name " + i);
                        user.setEmail("alibaba" + i + "@gmail.com");
                        mUsers.add(user);
                    }
                    mUserAdapter.notifyDataSetChanged();
                    mUserAdapter.setLoaded();
                }
            }, 5000);
        }
    });