Что меня озадачивает, так как мои первые шаги с Android - это оптимизированное использование настраиваемого адаптера с разными макетами для разных ориентаций.В настоящее время я попадаю в каскады проверок NULL и хотел бы знать, есть ли лучший способ.
Рассмотрим два разных макета для вертикальной и горизонтальной ориентации, которые содержат различное количество виджетов.
Вот вертикальный макет с одним виджетом, расположенным в макете:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal" >
<TextView
style="@style/TextViewDefault"
android:id="@+id/name"
android:layout_weight="1" />
</LinearLayout>
Вот горизонтальный макет с двумя виджетами, расположенными в компоновке:
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:orientation="horizontal" >
<TextView
style="@style/TextViewDefault"
android:id="@+id/name"
android:layout_weight="1" />
<TextView
style="@style/TextViewDefault"
android:id="@+id/description"
android:layout_weight="1" />
<TextView
style="@style/TextViewDefault"
android:id="@+id/date"
android:layout_weight="1" />
</LinearLayout>
А вот пользовательский адаптеррасширенный SimpleCursorAdapter.В зависимости от ориентации объекты описания и даты могут быть нулевыми или ненулевыми.В моих проектах для Android у меня есть макеты строк с десятыми объектами, и эти проверки на нуль становятся действительно неприятными в коде.Есть ли лучшее решение?Как вы, ребята, работаете с нестандартными адаптерами и разными макетами для разных ориентаций или размеров?
public class TestAdapter extends SimpleCursorAdapter {
private static class ViewHolder {
private TextView date;
private TextView description;
private TextView name;
}
private Context context;
private Cursor cursor;
private int layout;
private SQLiteDatabase sqliteDatabase;
private MySQLiteOpenHelper sqliteOpenHelper;
public Test(final Context context, final int layout, final Cursor cursor, final String[] from, final int[] to) {
super(context, layout, cursor, from, to);
this.context = context;
this.cursor = cursor;
this.layout = layout;
if (sqliteOpenHelper == null) {
sqliteOpenHelper = new MySQLiteOpenHelper(context);
}
if (sqliteOpenHelper != null) {
if (sqliteDatabase == null) {
sqliteDatabase = sqliteOpenHelper.getWritableDatabase();
}
}
}
@Override
public View getView(final int position, final View contentView, final ViewGroup viewGroup) {
View view = null;
ViewHolder viewHolder = null;
if (contentView == null) {
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(layout, null);
if (view != null) {
viewHolder = new ViewHolder();
viewHolder.date = (TextView) view.findViewById(R.id.date);
viewHolder.description = (TextView) view.findViewById(R.id.description);
viewHolder.name = (TextView) view.findViewById(R.id.name);
view.setTag(viewHolder);
}
} else {
view = contentView;
viewHolder = (ViewHolder) contentView.getTag();
}
if (viewHolder != null) {
cursor.moveToPosition(position);
String date = cursor.getString(cursor.getColumnIndex(Test.DATE));
String description = cursor.getString(cursor.getColumnIndex(Test.DESCRIPTION));
String name = cursor.getString(cursor.getColumnIndex(Test.NAME));
if (viewHolder.date != null) {
if (!StringUtils.isEmpty(date) && date.length() == 10) {
viewHolder.date.setText(Tools.formatDate(date.substring(0, 10)));
} else {
viewHolder.date.setText("");
}
}
if (viewHolder.description != null) viewHolder.description.setText(description);
if (viewHolder.name != null) viewHolder.name.setText(name);
}
return view;
}
}