2011-09-20 2 views
1

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. 방위에 따라서, 설명 오브젝트 및 일자 오브젝트는 null 또는 null 이외입니다. 내 Android projetcs에는 10 번째 객체가있는 행 레이아웃이 있으며이 null-check은 코드에서 실제로 심하게됩니다. 더 나은 해결책이 있습니까? 다른 방향이나 크기에 맞게 맞춤 어댑터와 레이아웃을 어떻게 사용합니까?

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; 
    } 
} 

답변

0

위젯 수가 서로 다르므로 사실 다른 데이터를 설정해야합니다.
하지만 당신은 다음과 같은 널 체크를 제거 할 수 있습니다

// 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); 
+0

당신이 확실합니까? 이는 "view = layoutInflater.inflate (layout, null)", "viewHolder = new ViewHolder()"및 "view.findViewById (R.id.name)"의 긍정적 인 결과를 항상 신뢰한다는 것을 의미합니다. 오리 엔테이션 변경 중에 너무 많은 NullPointerExceptions을 보아 왔지만 어디서나 NULL을 사용할 때만 사라졌습니다. –

+0

흠, 이상 하네. 왜 그런지 이유를 보지 못했고 결코 실패하지 않았기 때문에 항상 그런 식으로 검사했습니다. (아주 특별한 목록보기 디자인에서도) 실패했습니다. 어쩌면 당신은 그 일을해서는 안되는 특별한 것을하고있는 것일 수 있습니다. 재활용은 항상 잘 작동해야하며 일반적으로 방향 변경과 같은 일반적인 작업 때문에 실패하지 않아야합니다. – Knickedi

관련 문제