안드로이드 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 답변

    1. 한번 http 요청을 통해 받아온 이후 재 요청을 통해 페이지가 계속 갱신 되어야 하는지 여부
    2. 각 pager 들이 같은 content 를 공유하는지 여부

    등을 고려하여 구조를 잡아야 할것 같습니다.

    1. Repository 패턴을 사용해 볼 수 있습니다. 특정 Repository 클래스를 만들어두고, ViewPager 에서 Repository 클래스에 http 요청을 하도록 관련 메소드를 만들면 repository 에서 데이터를 갖고 있다가 임의의 Listener 를 통해 넘겨주는 방식을 생각해볼수 있겠네요.

    2. 다른 방법으로는 LiveDataViewModel 을 사용하는 것입니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 답변해주신 내용 공부해서 적용해보록 할게요!! 감사드립니다 알 수 없는 사용자 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

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)