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)
誰でも助けてくれますか?これを行う良い方法があります。私はgetViewTypeCountとgetItemViewTypeを追加しようとしています。問題は、これを実装する方法が混乱していることです。私は多くのコードサンプルを見て、まだ混乱しています。 – garrettwp
私たちは同じViewHolderとレイアウトを使用できないのですか?bindview()中に3番目のタイプのレイアウトのためにイメージビューを表示しないようにしてください – Vamsi