Как отобразить несколько моделей на экране переработчика с использованием одного адаптера? - PullRequest
0 голосов
/ 10 сентября 2018

У меня есть два разных типа объектов (например, Пользователь и Студент), оба имеют разные свойства.

Пользователь: Название Описание; Ученик: Название, описание, USN;

Есть ли способ, с помощью которого я могу сначала отобразить двух пользователей, а затем учащихся на экране рециркулятора, используя один и тот же адаптер? Как мне отобразить это, даже если это два адаптера. Я не хочу двух просмотров переработчика.

Обратите внимание, что приведенный пример очень прост. Изменение не только в пользовательском интерфейсе. Если изменение только в пользовательском интерфейсе, тогда можно использовать getItemViewType (), но здесь изменение находится в самой модели.

Список и Список

Как нам установить оба списка на один адаптер ??

Ответы [ 3 ]

0 голосов
/ 10 сентября 2018

Вы должны использовать метод переопределения "getItemViewType (position)".

Затем просто вернуть ViewHolder в соответствии с ViewType следующим образом:

  @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    RecyclerView.ViewHolder viewHolder = null;
    LayoutInflater inflater = LayoutInflater.from(parent.getContext());

    switch (viewType) {
        case ITEM:
            View v1 = inflater.inflate(R.layout.item_student, parent, false);
            viewHolder = new UserVH(v1);
            break;
        case LOADING:
            View v2 = inflater.inflate(R.layout.item_user, parent, false);
            viewHolder = new StudentVH(v2);
            break;
    }
    return viewHolder;
}

Редактировать:

 public class StudentVH extends RecyclerView.ViewHolder {
    //Declare student views

    public ViewHolder(View v) {
        super(v);
        //Inialize student views
    }
}

 public class UserVH extends RecyclerView.ViewHolder {
    //Declare user views

    public ViewHolder(View v) {
        super(v);
        //Inialize user views
    }
}

Второе редактирование:

Ваш адаптер должен быть таким,

public class ClGAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<UserBean> userBeans;
private List<StudentBean> studentBeans;
private UserBean userBeanItem;
private StudentBean studentBeanItem;
private int size = 0;


public ClGAdapter(Context context, List<UserBean> userBeans, List<StudentBean> studentBeans) {
    this.context = context;
    this.userBeans = userBeans;
    this.studentBeans = studentBeans;
    this.size = userBeans.size() + studentBeans.size();
}


@Override
public int getItemViewType(int position) {

    if (position > (userBeans.size() - 1)) {
        return 2;//TYPE_STUDENT
    } else {
        return 1; //TYPE_USER
    }
}

@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {

    int viewType = holder.getItemViewType();

    userBeanItem = userBeans.get(position);
    studentBeanItem = studentBeans.get(position);
    switch (viewType) {
        case 1:
            ((UserHolder) holder).mUserName.setText(userBeanItem.getUserName());
            break;
        case 2:
            ((StudentHolder) holder).mStudentName.setText(studentBeanItem.getStudentName());
            break;
        default:
            break;
    }

}

@Override
public int getItemCount() {
    return size;
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int layout = 0;
    RecyclerView.ViewHolder viewHolder;
    switch (viewType) {
        case 1: 
            layout = R.layout.user_card;
            View userView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
            viewHolder = new UserHolder(userView);
            break;
        case 2:
            layout = R.layout.student_card;
            View studentView = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
            viewHolder = new StudentHolder(studentView);

            break;
        default:
            viewHolder = null;
            break;
    }
    return viewHolder;
}

public class UserHolder extends RecyclerView.ViewHolder {
    private TextView mUserName;

    public UserHolder(View v) {
        super(v);
        mUserName = v.findViewById(R.id.user_name);
    }
}

public class StudentHolder extends RecyclerView.ViewHolder {
    private TextView mStudentName;

    public StudentHolder(View v) {
        super(v);
        mStudentName = v.findViewById(R.id.student_name);
    }
}
}
0 голосов
/ 10 сентября 2018

Я дам вам мою реализацию, надеюсь, поможет:

public class UserStudentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int USER_VIEW_TYPE = 0;
    private static final int STUDENT_VIEW_TYPE = 1;

    private List<User> mUserData;
    private List<Student> mStudentData;

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        switch (viewType) {
            case HEADER_VIEW_TYPE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_definition_header, parent, false);
                return new HeaderViewHolder(view);
            case CONTENT_VIEW_TYPE:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_index, parent, false);
                return new ItemViewHolder(view);
            default:
                return null;
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        switch (getItemViewType(position)) {
            case USER_VIEW_TYPE:
                //Show User data
                break;
            case STUDENT_VIEW_TYPE:
                //Show Student data
                break;
            default:
                break;
        }
    }

    @Override
    public int getItemCount() {
        return mUserData.size() + mStudentData.size();
    }

    @Override
    public int getItemViewType(int position) {
        return (position % 2 == 0) ? STUDENT_VIEW_TYPE : USER_VIEW_TYPE;
    }

}
0 голосов
/ 10 сентября 2018

просто используйте viewType, возвращайте другой viewType и связывайте разные данные в onBindViewHolder

...