2016-06-15 17 views
1

我有一個片段,onCreateView方法向服務器發送請求並獲取一些數據。這工作正常,但當我在onResume發送另一個請求時,它會使列表視圖中的數據翻倍。我該如何解決這個問題?在onResume中獲取數據在android中加倍數據?

代碼:

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    m_Main = inflater.inflate(R.layout.deal_listing, container, false);//intialize mainLayout 
    getDetails();// get deatail of user from sharedpreference...... 
    init();//initialize metho 
    return m_Main; 
} 

private void getDetails() {// get details of user from shared preference... 
    CLoginSessionManagement m_oSessionManagement = new CLoginSessionManagement(getActivity());// crating object of Login Session 
    HashMap<String, String> user = m_oSessionManagement.getLoginDetails();// get String from Login Session 
    m_szMobileNumber = user.get(CLoginSessionManagement.s_szKEY_MOBILE).trim();// getting password from saved preferences.......... 
    m_szEncryptedPassword = user.get(CLoginSessionManagement.s_szKEY_PASSWORD).trim();// getting mobile num from shared preferences... 
    sz_RecordCount = String.valueOf(m_n_DefaultRecordCount);// increment of record count 
    sz_LastCount = String.valueOf(m_n_DeafalutLastCount);// increment of last count... 

    s_oDataset = new ArrayList<>();// making object of Arraylist 

    if (NetworkUtil.isConnected(getActivity())) { 
     postDealListingDatatoServer();// here sending request in onCreate 
    } else { 

     Toast.makeText(getActivity(), "Please check internet connection !", Toast.LENGTH_LONG).show(); 
    } 

} 

@Override 
public void onResume() { 
    super.onResume(); 

    if (NetworkUtil.isConnected(getActivity())) { 
     postDealListingDatatoServer();// here in on Resume send request which double data 

    } else { 

     Toast.makeText(getActivity(), "Please check internet connection !", Toast.LENGTH_LONG).show(); 
    } 
} 

private void init() {// initialize controls 

    m_ProgressBar = (ProgressBar) m_Main.findViewById(R.id.progressBar1);// finding Id of progressview 
    m_ProgressBar.setVisibility(View.GONE);// make profressView Invisible first time 

    /*Swipe to refresh code*/ 
    mSwipeRefresh = (SwipeRefreshLayout) m_Main.findViewById(R.id.mainLayout); 
    mSwipeRefresh.setColorSchemeResources(R.color.refresh_progress_1); 

    mSwipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
     @Override 
     public void onRefresh() { 
      /*Here check net connection avialable or not */ 
      if (NetworkUtil.isConnected(getActivity())) { 

       m_ListView.removeFooterView(btnLoadMore); 
       s_oDataset.clear(); 
       m_n_DeafalutLastCount = 0; 
       sz_LastCount = String.valueOf(m_n_DeafalutLastCount);// convert int value to string ///// 
       swipeData(); 


      } else { 
       Toast.makeText(getActivity(), "Please check internet connection !", Toast.LENGTH_LONG).show(); 
       if (mSwipeRefresh.isRefreshing()) { 

        mSwipeRefresh.setRefreshing(false); 
       } 
      } 
     } 
    }); 
    m_n_FormImage = new int[]{// defining Images in Integer array 
      R.drawable.amazon, 
      R.drawable.whatsapp, 
      R.drawable.zorpia, 
      R.drawable.path, 
      R.drawable.app_me, 
      R.drawable.evernote, 
      R.drawable.app_me}; 

    m_ListView = (ListView) m_Main.findViewById(R.id.dealList);// findind Id of Listview 
    m_ListView.setFadingEdgeLength(0); 
    m_ListView.setOnScrollListener(new AbsListView.OnScrollListener() { 
     @Override 
     public void onScrollStateChanged(AbsListView view, int scrollState) { 


     } 

     @Override 
     public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
      if (firstVisibleItem == 0) { 
       mSwipeRefresh.setEnabled(true); 
      } else { 
       mSwipeRefresh.setEnabled(false); 
      } 
     } 
    }); 


} 

    /*This is new changes in code ....using Volley instead of AsynkTask*/ 

/*This method send request to server for deallisting*/ 
// this method send request to server for deal list.... 
public void postDealListingDatatoServer() { 
    try { 
     String json; 
     // 3. build jsonObject 
     JSONObject jsonObject = new JSONObject();// making object of Jsons. 
     jsonObject.put("agentCode", m_szMobileNumber);// put mobile number 
     jsonObject.put("pin", m_szEncryptedPassword);// put password 
     jsonObject.put("recordcount", sz_RecordCount);// put record count 
     jsonObject.put("lastcountvalue", sz_LastCount);// put last count 
     // 4. convert JSONObject to JSON to String 
     json = jsonObject.toString();// convert Json object to string 

     System.out.println("Request:-" + json); 
     m_Dialog = DialogUtils.showProgressDialog(getActivity(), "Please wait while loading deals..."); 
     JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.POST, CServerAPI.m_DealListingURL, jsonObject, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       System.out.println("Response:-" + response); 
       m_Dialog.dismiss(); 
       try { 
        JSONArray posts = response.optJSONArray("dealList");// get Deal list in array from response 
        for (int i = 0; i < posts.length(); i++) {// loop for counting deals from server 
         JSONObject post = posts.getJSONObject(i);// counting deal based on index 
         item = new CDealAppDatastorage();// creating object of DealAppdata storage 
         item.setM_szHeaderText(post.getString("dealname"));// get deal name from response 
         item.setM_szsubHeaderText(post.getString("dealcode"));// get dealcode from response 
         item.setM_szDealValue(post.getString("dealvalue"));// get deal value from response 
         item.setM_n_Image(m_n_FormImage[i]);//set Image Index wise(Dummy) 
         s_oDataset.add(item);// add all items in ArrayList 

        } 

        // LoadMore button 
        btnLoadMore = new Button(getActivity());// creating button 
        btnLoadMore.setText("LOAD MORE DEALS");// set Text in Button 
        btnLoadMore.setBackgroundResource(R.drawable.button_boarder);// set Background Resource 
        btnLoadMore.setTypeface(Typeface.DEFAULT_BOLD); 
        btnLoadMore.setTextSize(14); 
        btnLoadMore.setTextColor(Color.WHITE);// set Color of button text 
        btnLoadMore.setGravity(Gravity.CENTER);// set Gravity of button text 


        if (!s_oDataset.isEmpty()) {// condition if data in arraylist is not empty 
         // Adding Load More button to lisview at bottom 
         m_ListView.addFooterView(btnLoadMore);// add footer in listview 
         m_oAdapter = new CDealAppListingAdapter(getActivity(), s_oDataset);// create adapter object and add arraylist to adapter 
         m_ListView.setAdapter(m_oAdapter);//adding adapter to recyclerview 
        } else { 
         btnLoadMore.setVisibility(View.GONE);// else Load buttonvisibility set to Gone 
        } 
        btnLoadMore.setOnClickListener(new View.OnClickListener() { 
         @Override 
         public void onClick(View v) {// load more button onclick listener 
          if (NetworkUtil.isConnected(getActivity())) { 
           m_n_DefaultRecordCount = 5;// increment of record count by 5 on next load data 
           m_n_DeafalutLastCount = m_n_DeafalutLastCount + 5;// same here.....as above 
           String itemscount = String.valueOf(m_ListView.getAdapter().getCount()); 
           System.out.println("Toatal item:-" + itemscount); 

           sz_RecordCount = String.valueOf(m_n_DefaultRecordCount);// convert int value to string 
           sz_LastCount = String.valueOf(m_n_DeafalutLastCount);// convert int value to string ///// 
           loadmoreData(); 
          } else { 
           Toast.makeText(getActivity(), "Please check internet connection !", Toast.LENGTH_LONG).show(); 
          } 
         } 
        }); 
        if (response.getString("resultdescription").equalsIgnoreCase("Connection Not Available")) {//server based conditions 
         CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "Connection Lost !", getActivity()); 
        } else if (response.getString("resultdescription").equalsIgnoreCase("Deal List Not Found")) {// serevr based conditions ..... 
         CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "No more deals available", getActivity()); 

        } else if (response.getString("resultdescription").equalsIgnoreCase("Technical Failure")) { 
         CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "Technical Failure", getActivity()); 
        } 

       } catch (JSONException e) { 
        e.printStackTrace(); 
       } 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       System.out.println("Errror:-" + error); 
       m_Dialog.dismiss(); 
       if (error instanceof TimeoutError) { 
        CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "Connection lost ! Please try again", getActivity()); 
       } else if (error instanceof NetworkError) { 
        CSnackBar.getInstance().showSnackBarError(m_Main.findViewById(R.id.mainLayout), "No internet connection", getActivity()); 
       } 

      } 
     }); 
     RequestQueue requestQueue = Volley.newRequestQueue(getActivity()); 
     requestQueue.add(jsonObjectRequest); 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

} 
+0

postDealListingDatatoServer();方法在getDetails方法內部,並在onCreateView上調用getDetails方法。 –

回答

0

在向其中添加新數據之前,您應該清除s_oDataset

你可以做這樣的事情:

JSONArray posts = response.optJSONArray("dealList");// get Deal list in array from response 
s_oDataset.clear(); // clear the old values 
for (int i = 0; i < posts.length(); i++) {// loop for counting deals from server 
    JSONObject post = posts.getJSONObject(i);// counting deal based on index 
    item = new CDealAppDatastorage();// creating object of DealAppdata storage 
    item.setM_szHeaderText(post.getString("dealname"));// get deal name from response 
    item.setM_szsubHeaderText(post.getString("dealcode"));// get dealcode from response 
    item.setM_szDealValue(post.getString("dealvalue"));// get deal value from response 
    item.setM_n_Image(m_n_FormImage[i]);//set Image Index wise(Dummy) 
    s_oDataset.add(item);// add all items in ArrayList 
} 

要防止Button被加倍的,而不是這樣的:

m_ListView.addFooterView(btnLoadMore); 

你可以檢查您的ListViewFooterView,並創建Button相應地:

if(m_ListView.getFooterViewsCount() == 0) { 
    btnLoadMore = new Button(getActivity());// creating button 
    btnLoadMore.setText("LOAD MORE DEALS");// set Text in Button 
    btnLoadMore.setBackgroundResource(R.drawable.button_boarder);// set Background Resource 
    btnLoadMore.setTypeface(Typeface.DEFAULT_BOLD); 
    btnLoadMore.setTextSize(14); 
    btnLoadMore.setTextColor(Color.WHITE);// set Color of button text 
    btnLoadMore.setGravity(Gravity.CENTER); 
    m_ListView.addFooterView(btnLoadMore); 
} 
0

請刪除調用getDetails()從onCreateView這是調用postDealListingDatatoServer()。呼叫getDetails從的onResume

()方法),您現在可以刪除的if-else塊是在的onResume(並調用getDetails()從的onResume

另一種方式是,要求postDealListingDatatoServer明確之前s_oDataset()這將避免將相同的數據添加到列表

+0

請檢查我的更新回答 –

0

onResume()總是在onCreate()之後調用,所以沒有理由讓它們做同樣的事情。只需實現onResume調用數據更新代碼而不是onCreate()

+0

好吧我做到了,但它雙打按鈕btnloadmore – vishwas

+0

我不能通過你的代碼在這個時候正確。我的意思是,你必須設計你的代碼的方式是,每一個活動應該被調用一次應該在onCreate()中實現,並且每次用戶輸入你的活動時應該被更新的任何東西都應該在onResume ()。還要確保在onResume()中實現的任何東西都會清除以前的數據,否則如果用戶離開並再次返回到您的活動,則會再次出現問題。 – MotKohn