2017-11-23 11 views
0

내 프래그먼트에서 API 호출을하고 발리를 사용하여 응답을 얻고 있습니다. 해당 조각 탭을 클릭 할 때마다 API 호출이 다시 수행됩니다. API 호출이 한 번만 수행되기를 바랍니다. 이것을 달성 할 수있는 방법이 있습니까? 나는 해결책을 찾고자했지만 아무것도 유용하지 않았다. 아래 코드는 제 조각입니다. 이렇게하여이 조각의 부모 활동에서 API를 this-Api는 Volley를 사용하여 프래그먼트를 호출합니다.

1 전화를하고 그에 따라 'setArguments(bundle)'를 사용하여 조각에 데이터를 전달하는 방법은 두 가지가 있습니다

public class Tab3News extends Fragment { 

    private RecyclerView newsView; 
    private NewsAdapter newsadapter; 
    String myxmlResponse; 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     Log.d("Making request again","hello"); 
     View layout = inflater.inflate(R.layout.tab3news, container, false); 
     newsView = (RecyclerView) layout.findViewById(R.id.newstable); 
     String symPassed = ((SendString)getActivity()).message; 

     String XmlURL = "http://demoapplication-env.us-east-2.elasticbeanstalk.com/?symbol="+symPassed+"&indicator=XML"; 


     RequestQueue queue = Volley.newRequestQueue(getActivity().getApplicationContext()); 

     StringRequest req = new StringRequest(Request.Method.GET, XmlURL, 
       new Response.Listener<String>() 
       { 
        @Override 
        public void onResponse(String response) { 
         try { 
          //processData(response); 

          myxmlResponse = response; 

          newsView.setHasFixedSize(true); 
          //newsView.setItemAnimator(new DefaultItemAnimator()); 
          newsView.setLayoutManager(new LinearLayoutManager(getActivity())); 
          newsView.addItemDecoration(new DividerItemDecoration(getActivity(), DividerItemDecoration.VERTICAL_LIST)); 
          newsadapter = new NewsAdapter(getActivity(),getData()); 
          newsView.setAdapter(newsadapter); 

         } catch (UnsupportedEncodingException e) { 
          e.printStackTrace(); 
         } catch (XmlPullParserException e) { 
          e.printStackTrace(); 
         } catch (IOException e) { 
          e.printStackTrace(); 
         } 
        } 
       }, 
       new Response.ErrorListener() 
       { 
        @Override 
        public void onErrorResponse(VolleyError error) { 
         // handle error response 
        } 
       } 
     ); 
     queue.add(req); 


     return layout; 
    } 
} 
+0

환경 설정에 부울 값 하나를 유지하고이 조각을 클릭 할 때마다 값을 확인하십시오. –

+0

알았어. 네가 한 말을 정확히 이해하지 못했다. 완전히 안드로이드에 새로운. 사실 이것은 내 첫 번째 안드로이드 애플 리케이션입니다. 당신이 정교하게 해석 할 수 있습니까? 감사!! –

+0

나는 나의 대답에서 설명하려고 노력했다, 이것이 당신을 도울 것이기를 바란다. 이 작업을 수행하는 다른 방법이 있어야하지만 현재이 대답 만 생각하면 될 수 있습니다.이 대답이 도움이된다면 받아들입니다. –

답변

0

, 당신의 API 조각을로드 할 때마다 호출되지 않습니다. API가

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) 
{ 
     mMyPrefs = PreferenceManager.getDefaultSharedPreferences(this); 
     boolean isFirstTime = mMyPrefs.getBoolean("IS_FIRST_TIME", true); 
     if (mIsFirstTime) 
        { 
         SharedPreferences.Editor editPrefs = mMyPrefs.edit(); 
         editPrefs.putBoolean("IS_FIRST_TIME", false); 
         editPrefs.apply(); 

         callAPI(); 
        } 
     else 
     { 
      //TO DO YOUR STUFF 
     } 
} 
0

첫 번째 대답은 called- 때마다

2

는 기본 설정에서 부울 값을 유지합니다. Activity에서 API를 호출하여 Fragment을로드 할 때마다 Activity이 호출되지 않도록 할 수 있습니다. 데이터를 Fragment 번으로 setArguments() 번으로 전달하면됩니다.

두 번째는 Boolean 플래그를 사용하여 최초인지 여부를 나타냅니다. 그것을 확인할 수 있습니다. 마지막 옵션은 다음과 같은 조건, 이동 :

if(Newsview.getAdapter().getCount()==0) 
//Your API code 

덕분에 행복 내가 활동의 API를 호출하고 공유 우선 플래그를 사용하지 않고 번들을 통해 인수를 전달하는 더 나은 생각

0

코딩. 그리고 다시, 내 개인적인 의견.