2

이 질문은 StackOverflow의 다른 많은 질문과 매우 유사하지만 여기서는 다른 질문과 비교하여 접근 방식이 다르기 때문에 자체 게시물이 적합하다고 생각합니다.CursorAdapter의 커서를 변경하면 목록 항목보기가 제대로 업데이트되지 않는다

CursorAdapter을 확장하는 사용자 지정 어댑터가 있습니다. 데이터를 업데이트하고 해당 URI에서 notifyChange을 호출하여 커서를 새로 고침합니다. 디버깅에서 이것이 제대로 작동하는지 알 수 있습니다.

불행히도 내 목록보기가 다시 만들어지지 않습니다. 나는 그들을 다시 작성해야하는 이유는 어댑터에 내 newView 구현이다 :

public View newView(final Context context, final Ingredient ingredient, final ViewGroup parent) { 
    final int layout = ingredient.isOwned() ? LAYOUT_OWNED : LAYOUT_UNOWNED; 
    final View view = LayoutInflater.from(context).inflate(layout, null); 

    // ... ViewHolder magic 

    return view; 
} 

문제는 notifyChange를 호출하면 목록 데이터를 업데이트하는 것을이지만, 내가 newView를 통해 필요로하는보기를 다시하지 않습니다 . 데이터가 업데이트 된 후

  • adapter.notifyDataSetChanged() 전화 :

    는 여기에 내가 똑같이 작동하지 않았다 시도 다른 것들입니다.

  • contentResolver.notifyChange(...) 다음에 데이터가 업데이트 된 후 adapter.notifyDataSetChanged()이 표시됩니다.
  • adapter.changeCursor(newCursor)이고, 그 다음은 adapter.notifyDataSetChanged()이다.
  • 변경된 특정 목록 항목에 view.invalidate()이라고합니다.

다른 접근 방법에 대한 제안 사항은 무엇입니까?

편집 : 나는 잘못된 접근 방식을 취하고 있습니다. 나는 어댑터 내에서의 뷰의 재사용에 대해 오해하고있다. 그리고 나는 잘못된 유형의 뷰가 재활용 될 때 사용되는 것을 본다. 따라서 다른 접근 방식을 사용하여 내 견해를 스타일링해야 할 필요가있을 것입니다. 첫 번째로이 접근법을 사용하는 이유는 스타일을 사용하려는 나의 욕구 때문입니다.이 스타일은 뷰를 풍선을 explained in this StackOverflow question으로 팽창시키는 것 외에도 프로그래밍 방식으로 설정할 수 없습니다. 필자는 목록 항목보기를 적절하게 재활용하면서 해당 답변을 활용할 수있는 방법에 대해 공개적입니다.

답변

1

this StackOverflow answer에 기반하여 문제를 파악했습니다. 어댑터에서 getItemTypeCountgetItemViewType을 덮어 써야했습니다.

@Override 
public int getItemViewType(int position) { 
    return getItem(position).isOwned() ? 1 : 0; 
} 

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