如何从android中的recyclerview下面的服务器获取数据

时间:2016-03-16 07:20:40

标签: android

我试图在recyclelerview下面显示更多数据,比如无休止的滚动,问题是,首先我想在Act onCreate中从url获取数据然后再向下滚动发送请求并从服务器获取数据但数据未来我之前提取的5个以下数据而不是以下数据删除了之前的数据并且过来了,请帮助我。

 public class MainActivity extends AppCompatActivity {

    public static String m_DealListingURL = "http://192.163.0.110:8080/ireward/rest/json/metallica/getDealListInJSON";
    public CJsonsResponse m_oJsonsResponse;
    public String s_szresult = "";
    private Toolbar mToolbar;
    private RecyclerView mRecyclerView;
    private List<User> mUsers;
    private UserAdapter mUserAdapter;

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

        mToolbar = (Toolbar) findViewById(R.id.toolbar);
        mToolbar.setTitle("LoadMoreRecycleView");
        mUsers = new ArrayList<User>();

        new CDealDataSent().execute(m_DealListingURL);

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

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

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

                        new CDealDataSent().execute(m_DealListingURL);
                    }
                }, 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", "9555517491");
            jsonObject.put("pin", "05E0901648FD6439207FA74FC3E07734");
            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;
    }

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

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

        //      @Override
        protected void onPreExecute() {
            super.onPreExecute();
            m_PDialog = new ProgressDialog(MainActivity.this);
            m_PDialog.setMessage("Please wait while Loading Deals...");
            m_PDialog.setCancelable(false);
            m_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(String result) {

            m_PDialog.dismiss();
            try {
                m_oResponseobject = new JSONObject(result);// getting response from server
                final 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.setName(post.getString("dealname"));
                    item.setEmail(post.getString("dealcode"));
                    mUsers.add(item);
                }
                getResponse();

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

        public void getResponse() throws JSONException {
            if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Transaction Successful")) {

                mUserAdapter = new UserAdapter();//creating object of adapter and addd setting odata to adapter for use.
                mRecyclerView.setAdapter(mUserAdapter);//adding adapter to recyclerview
            } else if (m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Connection Not Available")) {
                Toast.makeText(MainActivity.this, "Connection not avaliable", Toast.LENGTH_SHORT).show();
            }

        }

    }

    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;
        }
    }
}

1 个答案:

答案 0 :(得分:0)

首先从public void run()

中删除这两行
 mUsers.remove(mUsers.size() - 1);
 mUserAdapter.notifyItemRemoved(mUsers.size());

并修改您的onPostExecute()内容

protected void onPostExecute(String result) {

    m_PDialog.dismiss();
    try {
        m_oResponseobject = new JSONObject(result);// getting response from server
        if(m_oResponseobject.getString("resultdescription").equalsIgnoreCase("Deal List Not Found"))
              return;
        final JSONArray posts = m_oResponseobject.optJSONArray("dealList");
        if(isFirstTime) {
        mUsers = new ArrayList<User>();
        isFirstTime = false;
        } else {
        mUsers.remove(mUsers.size() - 1);
        mUserAdapter.notifyItemRemoved(mUsers.size());
        }
        for (int i = 0; i < posts.length(); i++) {
            JSONObject post = posts.getJSONObject(i);
            item = new User();
            item.setName(post.getString("dealname"));
            item.setEmail(post.getString("dealcode"));
            mUsers.add(item);
            mUserAdapter.notifyItemInserted(mUsers.size());
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

isFirstTime

之前定义onCreate()变量并在isFirstTime = true;内初始化new CDealDataSent().execute(m_DealListingURL);