gpt4 book ai didi

android - Butterknife 无法在我的适配器类中绑定(bind)

转载 作者:IT老高 更新时间:2023-10-28 23:40:19 24 4
gpt4 key购买 nike

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

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 绑定(bind)我的 xml 中的元素。我错过了什么,或者做错了什么?

最佳答案

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

首先,api 文档声明如下

Be default, views are required to be present in the layout for both field and method bindings. If a view is optional add a @Nullable annotation such as the one in the support-annotations library.

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

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

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

@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 block 之外。

关于android - Butterknife 无法在我的适配器类中绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31447998/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com