2017-09-19 18 views
0

CursorAdapter으로 채워진 ListView으로 Android 데이터 바인딩 라이브러리를 사용하고 싶습니다. 그러나 어떻게 작동하는지 알 수는 없습니다. 나는 달성하는 것이 아주 간단하게 보인다.안드로이드는 CursorAdapter와 함께 데이터 바인딩 라이브러리를 사용합니다

public class PlayCursorAdapter extends CursorAdapter { 
    private List<Play> mPlays; 

    PlayCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor, 0); 
     mPlays = new ArrayList<>(); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ListItemPlayBinding binding = ListItemPlayBinding.inflate(LayoutInflater.from(context), parent, false); 
     Play play = new Play(); 
     binding.setPlay(play); 
     mPlays.add(play); 
     return binding.getRoot(); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     int timeIndex = cursor.getColumnIndexOrThrow(PlayEntry.COLUMN_TIME); 
     ... 

     long time = cursor.getLong(timeIndex); 
     ... 

     Play play = mPlays.get(cursor.getPosition()); 

     play.setTime(time); 
     ... 
    } 
} 

현재 행동 :이 코드를 실행하고 나는 목록에서 아래로 스크롤하면
내가 mPlays에 IndexOutOfBoundsException 목록을 얻을 수를

이 내가 지금 가지고있는 것입니다.

원하는 동작 :
나는 데이터 바인딩 라이브러리를 사용하여 ContentProviderCursorAdapter 데이터와 ListView을 채우려. CursorAdapter과 함께 데이터 바인딩 라이브러리를 사용할 수 있습니까? 또는 항상 RecyclerViewRecyclerView.Adapter을 사용 하시겠습니까?

답변

0

당신은 mPlays 목록을 제거하여 문제를 방지 할 수 있어야한다 :이이 가정

public class PlayCursorAdapter extends CursorAdapter { 
    PlayCursorAdapter(Context context, Cursor cursor) { 
     super(context, cursor, 0); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     ListItemPlayBinding binding = ListItemPlayBinding.inflate(LayoutInflater.from(context), parent, false); 
     Play play = new Play(); 
     binding.setPlay(play); 
     return binding.getRoot(); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 
     int timeIndex = cursor.getColumnIndexOrThrow(PlayEntry.COLUMN_TIME); 
     ... 

     long time = cursor.getLong(timeIndex); 
     ... 
     ListItemPlayBinding binding = DataBindingUtil.getBinding(view); 
     Play play = binding.getPlay(); 

     play.setTime(time); 
     ... 
    } 
} 

당신은 새로운 플레이 당신의 Bindview()마다 인스턴스화하고 싶지 않아요.

+0

감사합니다.이 솔루션이 효과적이었습니다. 'DataBindingUtil.getBinding (view)'부분을 찾고있었습니다. 'CursorAdapter' 대신에'RecyvlerView.Adapter'를 사용 하시길 권 하시겠습니까? 아니면이 상황에서 과도하게 사용합니까? 'RecyclerView '사용에 관한 매체의 게시물을 읽었습니다. –

+0

RecyclerView는 ListView의 대부분의 사용 사례를 처리하고 몇 가지 추가 기능을 갖춘 최신 위젯입니다. Android 라이브러리는 완전히 지원 라이브러리에 포함되어 있기 때문에 안정성이 향상됩니다. 그래서, 미래의 레이아웃을 위해 RecyclerView를 살펴볼 가치가 있다고 말하고 싶습니다. 즉, 무언가 잘 작동 할 때 변경할 이유가 없습니다. –