android - الروبوت استخدام صف مختلفة متعددة على ريسيكلرفيو ل داتابيندينغ الميزة



data-binding android-databinding (1)

أنت تحاول ربط طرق عرض المحول قبل أن يتم إنشاء حامل الرؤية. يجب أن يتم تنفيذ عرض ملزمة في أونبيندفيوهولدر () .

إنشاء فئة حامل عرض أساسي ShowBookItemsViewHolder RecyclerView.ViewHolder وله طريقة مجردة ربط (أوبجيكت ShowBookItemsViewHolder ) أن ShowBookItemsViewHolder و RobotViewHolder تنفيذ. الائتمان لجورج مونت لهذا النهج.

public abstract class BaseViewHolder extends RecyclerView.ViewHolder {

    ...

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

ثم في onBindViewHolder() :

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

سيقوم هذا بتمرير كائن موديرفاتداتا إلى حامل مشاهدة الطفل للربط:

public class ShowBookItemsViewHolder extends BaseViewHolder {

    ...

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

تجاوز getItemViewType() لتوريد onCreateViewHolder() مع أنواع عرض مختلفة. فمثلا:

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

استخدم نوع العرض لإنشاء أصحاب العرض:

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) 
    }
}

تأكد من onCreateViewHolder() بإرجاع حامل العرض الأساسي وفئة المحول تمتد RecyclerView.Adapter<YourAdapter.YourBaseViewHolder> .

أساسا يمكنني استخدام صف متعددة على ريسيكلرفيو أدابر دون أي مشكلة مثل هذا الرمز:

@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;
}

الآن أنا أحاول استخدام هذه الميزة عندما أستخدم داتابيندينغ، ولكن أحصل على خطأ ولا أستطيع أن أفعل ذلك

هذا هو رمز الخطأ الخاص بي:

@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