마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

tablayout 질문좀 할게요ㅠㅠㅠ

0 추천
public static Fragment newInstance(int tabPosition) {
    DesignDemoFragment fragment = new DesignDemoFragment();
    Bundle args = new Bundle();
    args.putInt(TAB_POSITION, tabPosition);
    fragment.setArguments(args);
    return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    tabPosition = getArguments() != null ? getArguments().getInt(TAB_POSITION) : 0;
}
class PagerAdapter extends FragmentStatePagerAdapter {

    public DesignDemoPagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position){
        return Fragment.newInstance(position);
    }

    @Override
    public int getCount() {
        return 7;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        String title = null;

        title = new CategoryAsyncTask().cateNameArrayList.get(position).toString();

        return title;
    }
}

 

이렇게 newinstance에 position 값 지정하고 args 값으로 들고오게 했습니다.

그런데 문제는 디버깅 했을때 제일 첫화면에 tabposition 값이 0을 들고오고 또 1을 들고 옵니다.

이거 버그인가요 ?ㅠ 왜이런건가요

그리고 제일 처음 tabposition 값 0을 안읽는거 같은데 ... 원래 이런건가요 ?ㅠ
New개발자 (510 포인트) 님이 2015년 10월 21일 질문

1개의 답변

0 추천
TabLayout 이면 다른소스는 안보이지만 ViewPager 쓰셨잖아요~?

ViewPager는 기본적으로 보이는 화면 + 좌우측 화면 3개를 동시에 생성해여

포지션이 0번자리니 좌측은 없을테고 우측인 1번 프래그먼트를 같이생성했겠죠?
홍월령 (4,240 포인트) 님이 2015년 10월 22일 답변
질문 답변에 감사합니다 ㅠㅠ
그래서 viewpager setOnPageChangeListener 써서 그 오버라이드 되어 있는 position 값을 이용을 했는데 그러면 탭 클릭시 위치가 안맞구요... 하나씩 생성되게는 못하나요 ?ㅠ getItemcurrent 값을 가져와도 엉망진창이네요 ... 지나갈때마다 remove를 시켜줘야하나요 ? 해결할수 있는방법이 없을까요 ...
어떤걸 구현하시는지를 잘모르겠네요^^;
onPageSelected 도 한번 이용해보세요
viewpager.getCurrentItem 또한 현재 페이지를 리턴합니다
tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
               @Override
                public void onTabSelected(TabLayout.Tab tab) {
                    viewPager.setCurrentItem(tab.getPosition());
                      AsyncTaks asynckTask= new AsyncTaks(viewpager.getCurrentItem)
                        AsyncTask.execute();
                }
                @Override
                public void onTabUnselected(TabLayout.Tab tab) {
                }
                @Override
                public void onTabReselected(TabLayout.Tab tab) {
                }
            });

대충 이런내용입니다 ㅠ
저기 execute는 recycleview를 setadapter를 해주는데 ...
예로들어서 tab의 위치가 0번이고 viewpager 위치가 0번이면 position 0을 대입시켜주는걸 하고싶은데 그게 안되네요 ㅠㅠ
arg 그냥 그대로 쓰세요. 아래 소스의 Test 함수 부분만 커스텀하세요


public class First extends Fragment {
    View v;
    RecyclerView mRecyclerView;
    JSONArray jsonArray;

    public static First create(int i) {
        First fragment = new First();
        Bundle bundle = new Bundle();
        bundle.putInt("item", i);
        fragment.setArguments(bundle);
        return fragment;
    }

    public First() {
        super();
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        v = inflater.inflate(R.layout.fragment_first, container, false);
        int item = getArguments().getInt("item");

        test(item);

        return v;
    }

    private void test(int i) {
        jsonArray = new JSONArray();
        if (i == 0) {
            try {
                jsonArray.put(1, 1);
                jsonArray.put(2, 2);
                jsonArray.put(3, 3);
                jsonArray.put(4, 4);


            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            try {
                jsonArray.put(1, 4);
                jsonArray.put(2, 3);
                jsonArray.put(3, 2);
                jsonArray.put(4, 1);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        init();
    }


    private void init() {
        mRecyclerView = (RecyclerView) v.findViewById(R.id.recycler);
        mRecyclerView.setHasFixedSize(true);
        mRecyclerView.setItemAnimator(new DefaultItemAnimator());
        LinearLayoutManager manager = new LinearLayoutManager(v.getContext(), LinearLayoutManager.VERTICAL, false);
        mRecyclerView.setLayoutManager(manager);
        mRecyclerView.setAdapter(new FirstRecyclerAdapter());
    }

    private class FirstRecyclerAdapter extends RecyclerView.Adapter<FirstViewHolder> {
        View v;

        @Override
        public FirstViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            v = LayoutInflater.from(parent.getContext()).inflate(R.layout.list_item_first, parent, false);
            return new FirstViewHolder(v);
        }

        @Override
        public void onBindViewHolder(FirstViewHolder holder, int position) {
            try {
            holder.title.setText("ㅋㅋㅋ:: " +  jsonArray.getString(position));

                Log.d("JSON", "" + jsonArray.getString(position));
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public int getItemCount() {
            return jsonArray.length();
        }
    }

    private class FirstViewHolder extends RecyclerView.ViewHolder {
        TextView title;

        public FirstViewHolder(View itemView) {
            super(itemView);
            title = (TextView) itemView.findViewById(R.id.list_title);
        }
    }

}
답변 감사드립니다 ㅠㅠㅠ
위와같이 해봐두 잘 안되네요 ㅠㅠ
어느정도 코드에 이해는 됐는데 아무래도 서버에서 가져오는 갯수대로 하니깐 한계가 있네요 ㅠ 그냥 UI변경으로 결정되었습니다.
답변해주셔셔 감사합니다 !
...