way Android utilise plusieurs lignes différentes sur la fonction RecyclerView for DataBinding



view model data binding android (1)

Vous essayez de lier les vues de l'adaptateur avant que son propriétaire de vue soit instancié. La liaison d' affichage doit être effectuée dans onBindViewHolder () .

Créez une classe de support de vue de base qui étend RecyclerView.ViewHolder et possède une méthode de liaison abstraite (Object obj) que ShowBookItemsViewHolder et RobotViewHolder implémentent. Nous remercions George Mount pour cette approche.

public abstract class BaseViewHolder extends RecyclerView.ViewHolder {

    ...

    // delegate binding to child class
    protected abstract void bind(Object obj);
}

Puis dans onBindViewHolder() :

public void onBindViewHolder(BaseViewHolder holder, int position) {
    holder.bind(adapterData.get(position)
}

Cela passera votre objet adapterData au titulaire de la vue enfant pour la liaison:

public class ShowBookItemsViewHolder extends BaseViewHolder {

    ...

    public void bind(Object obj) {
        // Bind here...
    }
}

Remplacez getItemViewType() pour fournir onCreateViewHolder() avec différents types d'affichage. Par exemple:

public int getItemViewType(int position) {
    // Change layout every other position
    return position % 2 == 0 ? 0 : 1;
}

Utilisez le type de vue pour construire les vues:

public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == 0) {
        return new ShowBookItemsViewHolder(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.your_layout, parent, false) 
    else {
        return new RobotViewHolder(LayoutInflater.from(parent.getContext())
                        .inflate(R.layout.your_layout, parent, false) 
    }
}

Assurez-vous que onCreateViewHolder() renvoie le support de vue de base et que la classe d'adaptateur étend RecyclerView.Adapter<YourAdapter.YourBaseViewHolder> .

Fondamentalement, je peux utiliser plusieurs lignes sur recyclaper adaper sans aucun problème comme ce code:

@Override
public ShowBookItemsViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int layout = -1;
    switch (viewType) {
        case 1:
            layout = R.layout.item_heading_one;
            break;
        case 2:
            layout = R.layout.item_heading_two;
            break;
    }

    View v = LayoutInflater.from(parent.getContext()).inflate(layout, parent, false);
    ShowBookItemsViewHolder holder = new ShowBookItemsViewHolder(v);
    return holder;
}

maintenant j'essaie d'utiliser cette fonctionnalité lorsque j'utilise DataBinding, mais je reçois une erreur et je ne peux pas le faire

c'est mon mauvais code:

@Override
public RobotViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    int layout = -1;
    if (inflater == null) {
        switch (viewType) {
            case 0:
                layout = R.layout.robot_item_action;
                break;
            case 1:
                layout = R.layout.robot_user_action;
                break;
        }
        inflater = LayoutInflater.from(parent.getContext());
    }
    RobotDataBinding dataBinding = RobotDataBinding.inflate(layout, parent, false);
    return new RobotViewHolder(dataBinding);
}




android-databinding