Пользовательский список адаптеров и различные макеты для вертикальной / горизонтальной ориентации - PullRequest
1 голос
/ 20 сентября 2011

Что меня озадачивает, так как мои первые шаги с 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;
    }
}

1 Ответ

0 голосов
/ 21 сентября 2011

Поскольку у вас разное количество виджетов, вам приходится иметь дело с фактами, устанавливающими разные данные.
Но вы можете избавиться от следующих нулевых проверок:

// wouldn't you expect to have a working layout here?
View != null        

// when view != null removed this is obsolete           
viewHolder != null

// the same thing here, you would expect a name here
viewHolder.name != null

// put that under viewHolder.date != null since both are available when one of them is
viewHolder.description.setText(description);
...