【问题标题】:Butterknife is unable to bind inside my Adapter ClassButterknife 无法在我的适配器类中绑定
【发布时间】:2015-07-16 07:32:04
【问题描述】:

我有一个为我的导航抽屉绘制布局的适配器。我的导航抽屉包含两个内部 xml 文件:一个是 Header,另一个是 Row。我在一个适配器中绘制了这些,但是当我尝试在我的标题上 setText() 时,我无法绑定。这是我的适配器类:

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

private static final int HEADER_TYPE = 0;
private static final int ROW_TYPE = 1;
private static Context context;
private static DatabaseHelper databaseHelper;

private List<String> rows;
private List<Integer> icons;
private String driverName;

public DrawerAdapter(Context context, List<String> rows, List<Integer> icons, String driverName, DatabaseHelper databaseHelper) {
    this.icons = icons;
    this.rows = rows;
    this.context = context;
    this.driverName = driverName;
    this.databaseHelper = databaseHelper;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if (viewType == HEADER_TYPE) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_header, parent, false);
        return new ViewHolder(view, viewType);

    } else if (viewType == ROW_TYPE) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.drawer_row, parent, false);
        return new ViewHolder(view, viewType);
    }
    return null;
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    if (holder.viewType == ROW_TYPE) {
        String rowText = rows.get(position - 1);
        int imageView = icons.get(position - 1);
        holder.textView.setText(rowText);
        holder.imageView.setImageResource(imageView);
    } else if (holder.viewType == HEADER_TYPE) {
        holder.driverNameText.setText(driverName);
    }
}

@Override
public int getItemCount() {
    return rows.size() + 1;
}

@Override
public int getItemViewType(int position) {
    if (position == 0)
        return HEADER_TYPE;
    return ROW_TYPE;
}

public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    protected int viewType;
    @Bind(R.id.drawer_row_icon)
    ImageView imageView;
    @Bind(R.id.drawer_row_text)
    TextView textView;
    @Bind(R.id.drawer_row_id)
    FrameLayout listRow;
    @Bind(R.id.driverName)
    TextView driverNameText;

    public ViewHolder(View itemView, int viewType) {
        super(itemView);

        this.viewType = viewType;

        if (viewType == ROW_TYPE) {
            ButterKnife.bind(this, itemView);
            imageView.setOnClickListener(this);
            textView.setOnClickListener(this);
            listRow.setOnClickListener(this);
        } else {
            ButterKnife.bind(this, itemView);
        }
    }


 }

正如您在我的 onCreateViewHolder 方法中看到的,我正在检查两个 viewType,因此我知道要绘制哪个布局。这反过来将为ViewHolder 类创建一个新对象,我在其中“尝试”根据viewType 绑定我的xml 中的元素。我是错过了什么,还是做错了什么?

【问题讨论】:

    标签: android butterknife


    【解决方案1】:

    我能够通过执行以下操作来解决这个问题:

    首先,api 文档声明如下

    默认情况下,字段和方法绑定的布局中都需要存在视图。如果视图是可选的,请添加 @Nullable 注释,例如 support-annotations 库中的注释。

    @Nullable @Bind(R.id.title) TextView subtitleView;

    http://jakewharton.github.io/butterknife/javadoc/

    现在,由于我要绑定来自不同 xml 文件的不同元素,因此我不得不将它们标记为 @Nullable,因为它们甚至可能一开始就无法绑定。我更改了我的代码以执行以下操作:

    @Nullable @Bind(R.id.drawer_row_icon)
    ImageView imageView;
    @Nullable @Bind(R.id.drawer_row_text)
    TextView textView;
    @Nullable @Bind(R.id.drawer_row_id)
    FrameLayout listRow;
    @Nullable @Bind(R.id.driverName)
    TextView driverNameText;
    

    同时将ButterKnife.bind() 移出我的IF-ELSE 块。

    【讨论】:

    • 对我来说,只是有错误数据的缓存,通过按清理按钮修复。
    【解决方案2】:

    您绑定了两次。您不能在同一个视图上调用 bind 两次。它只是在做你的 findviewbyid 电话。在 if 块上方调用 bind 一次。

    public ViewHolder(View itemView, int viewType) {
        super(itemView);
    
        this.viewType = viewType;
    
        ButterKnife.bind(this, itemView);
        if (viewType == ROW_TYPE) {
            imageView.setOnClickListener(this);
            textView.setOnClickListener(this);
            listRow.setOnClickListener(this);
        }
    }
    

    【讨论】:

    • 我确实试过了,但它仍然给我一个 RuntimeException 说它无法为这个适配器绑定视图。难道我的TextView driverNameText 属于我的drawer_header xml,而其他绑定属于drawer_row
    • @doubleA 有if语句怎么绑定两次?它只能根据条件执行第一个或第二个绑定命令。绝对不是你的答案。
    猜你喜欢
    • 2016-11-19
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多