안드로이드 viewpager질문드립니다.
조회수 1146회
Viewpager페이지가 5페이지인데 모두 http와 통신을 해서 데이터를 받아옵니다. 그런데 코드가 너무 중복되는거 같아서 따로 처리할 방법이 있을까요 떠오르지를 않아서요 ㅠㅠ
public class ViewPager1 extends Fragment{
ViewGroup rootView;
String title;
@Override
public void onDetach() {
super.onDetach();
}
@Nullable
@Override
public View onCreateView(@NonNull final LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
rootView = (ViewGroup) inflater.inflate(R.layout.view_pager1, container, false);
responsData();
Button button = rootView.findViewById(R.id.viewpager1_button);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
}
});
return rootView;
}
public void responsData() {
String url = "http://boostcourse-appapi.connect.or.kr:10000/movie/readMovieList?type=1";
StringRequest stringRequest = new StringRequest(
Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
processRespons(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
stringRequest.setShouldCache(false);
AppHelper.requestQueue.add(stringRequest);
}
public void processRespons(String response) {
Gson gson = new Gson();
ResponseInfo info = gson.fromJson(response, ResponseInfo.class);
MovieList movieList = gson.fromJson(response, MovieList.class);
if (info.code == 200) {
MovieInfo movieInfo = movieList.result.get(1);
title = movieInfo.title;
TextView text = rootView.findViewById(R.id.viewpager1_title);
if (title != null) {
text.setText(title);
} else {
Toast.makeText(getContext(), "data가 없습니다 인터넷 연결을 확인하세요", Toast.LENGTH_LONG).show();
}
}
}
=============================================================================
public class MainActivity extends AppCompatActivity {
MovieInfoFragment movieInfoFragment;
String title;
String resultOk;
ViewPagerAdapter adapter;
ViewPager viewPager;
ViewPager1 viewPager1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
movieInfoFragment = new MovieInfoFragment();
viewPager = findViewById(R.id.viewPager);
adapter = new ViewPagerAdapter(getSupportFragmentManager());
if (AppHelper.requestQueue == null) {
AppHelper.requestQueue = Volley.newRequestQueue(getApplicationContext());
}
responsData();
viewPager1 = new ViewPager1();
adapter.addItems(viewPager1);
Bundle bundle = new Bundle();
bundle.putString("title",title);
viewPager1.setArguments(bundle);
ViewPager2 viewPager2 = new ViewPager2();
adapter.addItems(viewPager2);
ViewPager3 viewPager3 = new ViewPager3();
adapter.addItems(viewPager3);
ViewPager4 viewPager4 = new ViewPager4();
adapter.addItems(viewPager4);
ViewPager5 viewPager5 = new ViewPager5();
adapter.addItems(viewPager5);
viewPager.setAdapter(adapter);
}
public void responsData() {
String url = "http://boostcourse-appapi.connect.or.kr:10000/movie/readMovieList?type=1";
StringRequest stringRequest = new StringRequest(
Request.Method.GET,
url,
new Response.Listener<String>() {
@Override
public void onResponse(String response) {
processRespons(response);
}
},
new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
}
}
);
stringRequest.setShouldCache(false);
AppHelper.requestQueue.add(stringRequest);
}
public void processRespons(String response) {
Gson gson = new Gson();
ResponseInfo info = gson.fromJson(response, ResponseInfo.class);
MovieList movieList = gson.fromJson(response, MovieList.class);
if (info.code == 200) {
MovieInfo movieInfo = movieList.result.get(1);
title = movieInfo.title;
}
}
public class ViewPagerAdapter extends FragmentStatePagerAdapter {
ArrayList<Fragment> items = new ArrayList<Fragment>();
public void addItems(Fragment fragment) {
items.add(fragment);
}
public ViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
return items.get(position);
}
@Override
public int getCount() {
return items.size();
}
}
}
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
- 한번 http 요청을 통해 받아온 이후 재 요청을 통해 페이지가 계속 갱신 되어야 하는지 여부
- 각 pager 들이 같은 content 를 공유하는지 여부
등을 고려하여 구조를 잡아야 할것 같습니다.
-
(•́ ✖ •̀)
알 수 없는 사용자
- 답변해주신 내용 공부해서 적용해보록 할게요!! 감사드립니다 알 수 없는 사용자 2018.7.21 11:53
- 1. 이후 추가 갱신은 없습니다. 2. 각각 다른 conetent입니다. 알 수 없는 사용자 2018.7.21 11:54
- 그럼 데이터가 크지 않다는 가정하에 해당 content 를 한번에 요청할 서버 API 가 있다면 ViewPager 로딩 전에 먼저 Activity 에서 http 요청 하여 데이터를 먼저 다 받아온 후 ViewPager 구성할때 setArgument 로 넘겨주는 방법도 있겠네요. 알 수 없는 사용자 2018.7.21 11:58
- adapter가 추가되기전에 setArgument해야되나요? 위에 코드 첨부또 해놧습니다... 알 수 없는 사용자 2018.7.21 12:07
- activity 에서 먼저 데이터를 받는 상황이라면 , 데이터를 받은 후 Fragment 를 생성할떄 setArgument() 를 통해 데이터를 넣어주고 addItem() 으로 list 에 해당 fragment 를 넣어 줍니다. 그후 setAdapter() 를 하면 fragment 가 바인딩 될 것이고, getArgument() 로 데이터를 가져와서 fragment 가 구성 되도록 처리하면 될것 같네요. 알 수 없는 사용자 2018.7.21 12:12
- 네 감사합니다. 그런데 processRespons에서 title에 string값을 넣어줫는데 왜 들어가지 않는걸까요~? 먼저 Toast로 확인을 해봤는데 아무값도 들어있지 않습니다... 위에 title을 변수로 만들어줫는데 왜그런지 모르겠어요... 아래에 processResopons에서 Toast를 직접 띄어보면 값이 나오는데.... 알 수 없는 사용자 2018.7.21 13:04
- 아무값도 들어있지 않은걸 확인한 시점이 http 요청 후 response 받기전의 시점이 아닐까요? 알 수 없는 사용자 2018.7.21 13:08
- 아니요 processResopons로 먼저 확인을 한 후 받았는데 위의 bundle에 담기는게 아무것도 없습니다. 알 수 없는 사용자 2018.7.21 13:42
- 코드를 보면 responseData() 호출 후 곧바로 setArgument() 후 setAdapter 를 하는데, 네트워크 동작이 비동기 작업이라 이러면 setAdapter 시점이 데이터를 받아왔을 것이라고 확신 할 수 없습니다. processResponse() 에서 onResponse() callback 이 호출 된 후 setArgument 및 setAdapter 를 해야 할것 같네요 알 수 없는 사용자 2018.7.21 13:49
- 말씀하신대로 ㅠㅠ 됬습니다 ㅠㅠ 공부를 한다고했는데도 너무나 모자라서 ㅠㅠ 답답해 죽겠네요 ㅠㅠ 알 수 없는 사용자 2018.7.21 13:58
- 저도 아직 모르는부분이 많지만 하나씩 부딪혀가면서 배워가신다고 생각하시면 될것 같아요 :) 알 수 없는 사용자 2018.7.21 14:12
- 매번 답변주셔서 감사드립니다!! 알 수 없는 사용자 2018.7.21 21:17
댓글 입력