2011-08-17 6 views
0

java 및 android 프로그래밍을 처음 사용합니다. 그래서 제 프로젝트는 거대한 학습 경험이었습니다. 데이터베이스에서 데이터를 검색 한 다음 해당 데이터를 사용자 지정 어댑터에 할당하는 커서 로더를 사용하고 있습니다. 내가하려는 것은 데이터를 가져 와서 그 데이터가 무엇인지에 따라 특정 행 레이아웃에 할당하는 것입니다.여러 행보기가있는 사용자 정의 SimpleCursorAdapter

약 6-12 개의 레이아웃이 있습니다. 데이터에 다른 유형의 기기가 있습니다 (예 : 조명 장치, 조광기, 자동 온도 조절기 등이 있습니다. 각 장치 유형은 범주 번호와 연관됩니다. 빛은 범주 3을 가지고 카테고리 번호 2를 더 밝게합니다. 범주를 확인하고 번호에 따라 특정 행 레이아웃에 할당합니다. 어떻게하면이 일을 할 수 있습니까? 사용자 정의 simplecursoradapter를 만들려고합니다. 이것은 내가 지금까지 가지고있는 것이지만, 충돌한다.

public class DeviceAdapter extends SimpleCursorAdapter { 
    private LayoutInflater mInflater; 
    private ViewHolder holder; 
    private LightViewHolder lightholder; 
    private TempViewHolder tempholder; 

    public DeviceAdapter(Context context, int layout, Cursor c, String[] from, int[] to) { 
     super(context, layout, c, from, to); 
     this.mInflater = LayoutInflater.from(context); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     if (cursor.getString(4).equals("17")) {; 
      tempholder = (TempViewHolder)view.getTag(); 
      tempholder.name.setText(cursor.getString(1)); 
      tempholder.temp.setText(cursor.getString(10)); 
      tempholder.tempImage.setImageResource(R.drawable.thermometer); 
     } else if (cursor.getString(4).equals("3")) { 
      lightholder = (LightViewHolder)view.getTag(); 
      lightholder.name.setText(cursor.getString(1)); 
      lightholder.status.setText(cursor.getString(10)); 
      lightholder.lightImage.setImageResource(R.drawable.light_on); 
     } else { 
      holder = (ViewHolder)view.getTag(); 
      holder.name.setText(cursor.getString(1)); 
      holder.status.setText(cursor.getString(2)); 
     } 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 
     if (cursor.getString(4).equals("17")) { 
      View view = mInflater.inflate(R.layout.temperature_device_list_item, null); 
      tempholder = new TempViewHolder(); 
      tempholder.name = (TextView)view.findViewById(R.id.devicename); 
      tempholder.temp = (TextView)view.findViewById(R.id.temp); 
      tempholder.tempImage = (ImageView)view.findViewById(R.id.tempImage); 
      view.setTag(tempholder); 
      return view; 
     } else if (cursor.getString(4).equals("3")) { 
      View view = mInflater.inflate(R.layout.light_list_item, null); 
      lightholder = new LightViewHolder(); 
      lightholder.name = (TextView)view.findViewById(R.id.devicename); 
      lightholder.status = (TextView)view.findViewById(R.id.status); 
      lightholder.lightImage = (ImageView)view.findViewById(R.id.deviceImage); 
      view.setTag(lightholder); 
      return view; 
     } else { 
      View view = mInflater.inflate(R.layout.device_list_item, null); 
      holder = new ViewHolder(); 
      holder.name = (TextView)view.findViewById(R.id.devicename); 
      holder.status = (TextView)view.findViewById(R.id.status); 
      view.setTag(holder); 
      return view; 
     } 
    } 


    private static class LightViewHolder { 
     TextView name; 
     TextView status; 
     ImageView lightImage; 
    } 

    private static class TempViewHolder { 
     TextView name; 
     TextView temp; 
     ImageView tempImage; 
    } 

    private static class ViewHolder { 
     TextView name; 
     TextView status; 
    } 

} 

이 모양이 맞습니까? 나는이 모든 것을 처음 접했고 좋은 예를 찾기 위해 노력하고있다. 대부분의 코드 예제는 getView를 호출하고 있으며 bindView와 newView를 사용해야한다고 읽었습니다.

내 응용 프로그램에는 장치 목록이 포함 된 조각과 조각이 있습니다. 한 방을 클릭하면 충돌이 발생하고 목록에 장치가 표시됩니다. 내가 가서 다른 방을 클릭하면, 다음과 같은 응용 프로그램이 중단됩니다 내가 얻을 :

08-17 03:41:07.033: ERROR/AndroidRuntime(7210): FATAL EXCEPTION: main 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210): java.lang.ClassCastException: com.garrettpower.powerha.listadapters.listview.DeviceAdapter$LightViewHolder cannot be cast to com.garrettpower.powerha.listadapters.listview.DeviceAdapter$ViewHolder 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at com.garrettpower.powerha.listadapters.listview.DeviceAdapter.bindView(DeviceAdapter.java:42) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.CursorAdapter.getView(CursorAdapter.java:251) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.AbsListView.obtainView(AbsListView.java:1949) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.ListView.makeAndAddView(ListView.java:1756) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.ListView.fillSpecific(ListView.java:1302) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.ListView.layoutChildren(ListView.java:1587) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.AbsListView.onLayout(AbsListView.java:1800) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.RelativeLayout.onLayout(RelativeLayout.java:912) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.FrameLayout.onLayout(FrameLayout.java:400) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1542) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1403) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.LinearLayout.onLayout(LinearLayout.java:1314) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.widget.FrameLayout.onLayout(FrameLayout.java:400) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.View.layout(View.java:9588) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewGroup.layout(ViewGroup.java:3877) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewRoot.performTraversals(ViewRoot.java:1288) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.view.ViewRoot.handleMessage(ViewRoot.java:2046) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.os.Handler.dispatchMessage(Handler.java:99) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.os.Looper.loop(Looper.java:132) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at android.app.ActivityThread.main(ActivityThread.java:4123) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at java.lang.reflect.Method.invokeNative(Native Method) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at java.lang.reflect.Method.invoke(Method.java:491) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:841) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:599) 
08-17 03:41:07.033: ERROR/AndroidRuntime(7210):  at dalvik.system.NativeStart.main(Native Method) 
+0

아무도 도와 줄 수 있습니까? 이렇게하는 좋은 방법이있다. 나는 계속해서 getViewTypeCount와 getItemViewType을 추가해 보았습니다. 문제는 이것을 구현하는 방법에 대해 혼란 스럽습니다. 나는 많은 코드 샘플을보고 여전히 혼란 스럽다. – garrettwp

+0

우리는 동일한 ViewHolder와 레이아웃을 사용할 수 없습니까?, bindview() 중 레이아웃의 세 번째 유형에 대해 이미지 뷰를 보이지 않게 할 수 있습니다. – Vamsi

답변

0

나는이 꽤 오래 알고 있지만 경우에 사람이 구글이나 뭔가에서이 건너 온다.

문제

bindViewTempViewHolder ViewHolder A를 캐스팅하려고 노력이었다 -이 두 사용자 정의 어댑터에 정의 된 내부 클래스입니다, 그리고 그들이 다르기 때문에 그들은 하나에서 다른 캐스팅 할 수 없습니다.

결코 중요하지 않습니다. 입니다. ListViewconvertView에서 필요한보기 유형과 동일한보기 유형을 제공합니다.

적어도 스택 추적이 보여줍니다. 다른 문제가있을 수 있지만 문제를 해결하면 다음 문제가 드러납니다.

+1

여기에있는 코드는 단지 'convertView'를 제공하지 않고 있습니다. 재사용 가능한 뷰가 있지만, SimpleCusrorAdapter를 사용하면 다른 뷰 유형을 지원하지 않습니다. 반면에'BaseAdapter'는 않습니다. – Flexicoder

관련 문제