2011-08-17 8 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を使うべきだと読んでいます。

私のアプリケーションには部屋の断片と、デバイスのリストを含む断片があります。 1つの部屋をクリックするとクラッシュし、リストにはデバイスが表示されます。私が行くと別の部屋をクリックすると、以下のアプリケーションがクラッシュすると、私が手:

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()中に3番目のタイプのレイアウトのためにイメージビューを表示しないようにしてください – Vamsi

答えて

0

私はこれはかなり古いです知っているが、場合には誰もがGoogleや何かからこの出くわします。これらの両方は、カスタムアダプタで定義された内部クラスであり、それらが異なっているため、彼らは、一方から他方へキャストすることはできません -

問題はbindViewViewHolderTempViewHolderをキャストしようとしたということでした。

となります。ListViewは、同じタイプのビューをconvertViewに提供しています。

少なくとも、スタックトレースにはこれが表示されます。他にも問題があるかもしれませんが、それは次の問題を明らかにするでしょう。

+1

ここにあるコードは 'convertView'を与えていません。それは持っている再利用可能なビューですが、 'SimpleCusrorAdapter'では、別のビュータイプをサポートしていません。一方、 'BaseAdapter'はそうします – Flexicoder

関連する問題