현재 RecycleView 용 사용자 정의 다중보기 유형을 작업하고 있습니다. 이 문제에 대한 여러 가지 해결책을 찾았지만 제 길을 나눌 것입니다.RecycleView의 다중보기 유형을 구현하는 방법은 무엇입니까?
다른 것은 ViewType 정의에 enum
을 사용합니다.
자세한 내용은 내 대답을 참조하십시오. (그냥 공유하고 싶음).
현재 RecycleView 용 사용자 정의 다중보기 유형을 작업하고 있습니다. 이 문제에 대한 여러 가지 해결책을 찾았지만 제 길을 나눌 것입니다.RecycleView의 다중보기 유형을 구현하는 방법은 무엇입니까?
다른 것은 ViewType 정의에 enum
을 사용합니다.
자세한 내용은 내 대답을 참조하십시오. (그냥 공유하고 싶음).
이 글을 읽을 것을 권장합니다
UPDATE : 여기
Writing Better Adapter 길 RecyclewView에 대한 I 맞춤형 멀티 뷰 유형이다.
먼저 코드를 표시하고 다음 설명을 보여줍니다.
어댑터의 데이터 &가 Wrapper
클래스에서 확장 일반적이다 : 당신은 어댑터를 볼 수 있습니다
@SuppressWarnings("unchecked")
public class BaseAdapter extends RecyclerView.Adapter<BaseAdapter.ViewHolder> {
private final List<Wrapper<?>> items;
public BaseAdapter() {
this.items = new ArrayList<>();
}
@Override
public int getItemViewType(int position) {
return items.get(position).viewType;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return ViewType.values()[viewType].onCreateViewHolder(parent);
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
holder.onBind(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
public void simulateAddItems() {
items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User()));
items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User()));
items.add(new Wrapper<>(ViewType.USER.viewTYpe(), new User()));
items.add(new Wrapper<>(ViewType.BOTTOM.viewTYpe(), new BottomData()));
notifyDataSetChanged();
}
public enum ViewType {
USER {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
return new UserViewHolder(itemView);
}
},
BOTTOM {
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent) {
return new BottomViewHolder(itemView);
}
};
public abstract ViewHolder onCreateViewHolder(ViewGroup parent);
public int viewTYpe() {
return ordinal();
}
}
static class Wrapper<T> {
final int viewType;
final T data;
public Wrapper(int viewType, T data) {
this.viewType = viewType;
this.data = data;
}
}
public static class ViewHolder<T> extends RecyclerView.ViewHolder {
private T item;
public ViewHolder(View itemView) {
super(itemView);
}
public void onBind(T item) {
}
}
public static class UserViewHolder extends ViewHolder<User> {
public UserViewHolder(View itemView) {
super(itemView);
}
@Override
public void onBind(User item) {
super.onBind(item);
}
}
public static class BottomViewHolder extends ViewHolder<BottomData> {
public BottomViewHolder(View itemView) {
super(itemView);
}
@Override
public void onBind(BottomData item) {
super.onBind(item);
}
}
static class User {
// user fields & method
}
static class BottomData {
// bottom data fields & method
}
}
은 특별한 무언가가있다. Wrapper
클래스의 POJO 클래스는 두 개의 필드 viewType
& item
데이터를 포함합니다. viewType
은 getItemViewType(int position)
을 통과하고 item
은 각보기 소유자의 데이터입니다.
일반 ViewHolder
(T
)은보기 소유자의 데이터 종류입니다. 두 개의 사용자 지정보기 소유자 UserViewHolder
및 BottomViewHolder
이 ViewHolder
에서이 데이터로 확장 된 것을 볼 수 있습니다. (따라서 각 뷰 홀더의 onBind
에는 정확한 데이터가 필요합니다.> 캐스팅 할 필요가 없습니다. 이미 캐스팅되어 있기 때문에).
enum ViewType
에는 모든보기 유형의 어댑터가 들어 있습니다. 또한 뷰 유형에서 우리는 ViewHolder onCreateViewHolder(ViewGroup parent)
메서드를 사용하므로 viewHolder를 ViewType
에서 쉽게 만들 수 있습니다. ViewType을 기준으로 Holder를 보는 것이 우리 눈에 더 쉽다고 생각합니다.
는 또한, 우리는 단순히 열거의 ordinal()
을 반환 viewType()
방법이있다. 참조로 java docs
해당 방법을 사용할 수 없습니다. 그러나이 경우에는 (고유하기 때문에) 사용하는 것이 충분히 공정하다고 생각합니다.
그래서 방법에 어댑터의 onCreateViewHolder
우리가 할 수있는 간단한 전화 : return ViewType.values()[viewType].onCreateViewHolder(parent);
및 onBindViewHolder
우리가 holder.onBind(items.get(position));
를 호출합니다.
마지막으로 어댑터에 항목을 추가하는 방법을 데모 용으로 simulateAddItems
을 만들었습니다.
다음은 RecycleView의 사용자 정의보기 유형으로 작업하는 동안의 경험입니다. 유용하다고 희망 & 다른 사람들을 돕기.
[Recyclerview 및 다른 종류의 행 인플레이션 처리 가능]의 복제본 (https://stackoverflow.com/questions/25914003/recyclerview-and-handling-different-type-of-row-inflation) –