ナビゲーションドロワーのレイアウトを描画するアダプターがあります。私のナビゲーションドロワーには、2つの内部xmlファイルが含まれています。1つはでHeader
、もう1つは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
クラスの新しいオブジェクトが作成され、に応じてxml内の要素をバインドするように「TRY」しviewType
ます。私は何かが足りないのですか、それとも間違ったことをしていますか?
私は次のことを行うことでこの問題を解決することができました:
まず、APIドキュメントには次のように記載されています
デフォルトでは、フィールドとメソッドの両方のバインディングのレイアウトにビューが存在する必要があります。ビューがオプションの場合は、support-annotationsライブラリにあるような@Nullableアノテーションを追加します。
@Nullable @Bind(R.id.title) TextView subtitleView;
バインドする要素が異なる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
ブロックの外側にも移動しながら。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加