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

데이터 바인딩과 ViewPager 연계

0 추천

일단 제가 원하는 방향부터 말씀 드리면 LINE의 메세지 알림창같은걸 구현하려고합니다.

최근에 데이터 바인딩이라는걸 알게되서 정말 편하게 쓰고있는데 데이터 바인딩 객체와 View간의 캐스팅이 안되더라구요.

어댑터를 아래와 같이 구현을 해놨는데 첫페이지만 뜨고 그다음 페이지는 뜨질 않네요.

메신저처럼 막 여러개가 오는게 아니라서 페이지 수는 제 생각에 2개로 일정할 것 같습니다.

일단 레이아웃은 basic과 advanced 둘다 두개를 복붙해놨구요.

(데이터바인딩이라 복붙해도 id를 공유할 수 있는게 참 좋네요.)

 

문제가 되는 부분이 inst~item 함수에서 Object형으로 return하는 부분인데 보통은 View를 inflate해서 리턴을 하거든요. 데이터 바인딩으로 저렇게 inflate를 하면 사실 사용하는데 지장은 없...어야되는데 작동이 제대로 안되서 어떤게 문제인지가 궁금합니다.

 

구조는 액티비티 레이아웃 정 가운데 Fixed사이즈의 ViewPager가 있고, Fragment를 쓰지 않고 Layout을 직접 inflate해서 사용합니다. (이게 문제일까요? Fragment 클래스가 느는것도 싫고 파일 관리하기도 귀찮고 굳이 Fragment 안 써도 될 것 같아서 이런식으로 했는데...)

 

public class AlarmAdapter extends PagerAdapter {
    private LayoutInflater mInflater;
    private AlarmData mData;

    private static final int BASIC = 0;
    private static final int ADVANCED = 1;

    public AlarmAdapter(LayoutInflater mInflater, AlarmData mData) {
        this.mInflater = mInflater;
        this.mData = mData;
    }

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        switch (position) {
            case BASIC: {
                LayoutBasicAlarmBinding layout = DataBindingUtil.inflate(mInflater, R.layout.layout_basic_alarm,
                        container,
                        true);

                layout.layout.setBackgroundColor(Color.WHITE);
                layout.subject.setText(mData.getSubject());
                layout.content.setText(mData.getContent());

                return layout;
            }
            case ADVANCED: {
                LayoutAdvancedAlarmBinding layout = DataBindingUtil.inflate(mInflater, R.layout.layout_advanced_alarm,
                        container,
                        true);

                layout.layout.setBackgroundColor(Color.WHITE);
                layout.subject.setText(mData.getSubject());
                layout.content.setText(mData.getContent());

                return layout;
            }
            default: {
                return null;
            }
        }
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View)object);
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return true;
    }
}
sloth 님이 2017년 3월 26일 질문

1개의 답변

0 추천
쎄미 (162,410 포인트) 님이 2017년 3월 26일 답변
...