0

リストビューを定義するには、レイアウトで最も簡単な方法を使用します。

<ListView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:drawSelectorOnTop="true" />

チェックリストが必要なのでCheckedTextView、listitem テンプレートで使用します。ユーザーはリスト内の項目を好きなだけチェックできます。それはうまくいっています。

私はListActivityルートビューを持っています:

public abstract class ActivityList extends ListActivity {
 protected ListView listView;
 public abstract void renderListView( String filter );
 @Override
 public void onCreate( Bundle savedInstanceState ) {
  super.onCreate( savedInstanceState );
  setContentView( R.layout.commonlist );
  listView = getListView();
 }
}

ActivitiList製品、クライアントなどの他のビュークラスの親になるため、抽象的です。抽象 renderlistview()は、次のような子によって実装されますSimpleCursorAdapter

public class ActivityProductList extends ActivityList {
 @Override
 public void onCreate( Bundle savedInstanceState ) {
  super.onCreate( savedInstanceState );
  ...
  renderListView( null );
 }
 @Override
 public void renderListView( String filter ) {
  listView.setChoiceMode( ListView.CHOICE_MODE_MULTIPLE );
  ...
  SimpleCursorAdapter sca = new SimpleCursorAdapter( this, R.layout.productlistitemchecked, mCursor, from, to );
  setListAdapter( sca );
 }
}

ActivityProductListは正常に動作しています。ユーザーはやりたいことをすべて実行し、リストビューもある親クラスで定義および実装された FINISH ボタンをクリックします。彼のイベント ハンドラーは次のとおりです。

protected void getCheckedItems() {
 try {
   String className = this.getListAdapter().getClass().getName();
   Log.e("NanCal", className);
   Class c = this.getListAdapter().getClass();
   ListAdapter la = this.getListAdapter();
   SimpleCursorAdapter ca = ( SimpleCursorAdapter )la;
   Cursor cursor = ca.getCursor();
   SparseBooleanArray selectedItems = listView.getCheckedItemPositions();
   for( int i = 0; i < selectedItems.size(); i++ ) {
    int selectedPosition = selectedItems.keyAt( i );
    cursor.moveToPosition( selectedPosition );
    long rowId = ca.getItemId( selectedPosition );
    Log.d( "", "row id: " + rowId );
   }
  } catch( Exception exception ) {
   Log.e( "NanCalc", exception.getMessage() + "::" + exception.toString() );
  }
}

コンセプトは、選択したアイテムの ID を取得することです。

ただし、コメントでマークした行で、プログラムがエラーでクラッシュします。 日食スクリーンショット部分

this.getListAdapter ()CursorAdapterは、キャストがクラッシュするよりも私に与えます。

誰か助けてくれませんか?

4

2 に答える 2

0

刀で問題を解決しました...

親クラス(ActivityList)からSimpleCursorAdapterにアクセスしようとしました。この方法は機能しませんでした。したがって、基本クラスをabstractに変更し、選択した行IDを返すabstractメソッドを追加しました。抽象メソッドは子クラス(ActivityProductList)に実装されています。

私はこの解決策が元の問題に言及していないことを知っています。しかし、それは機能します...

すべての回答ありがとうございます。

于 2012-08-28T13:25:49.587 に答える
0

詳細情報がないと、なぜこの問題が発生するのかを説明するのは困難です。コードをデバッグし、コメント化されたエラー行にブレーク ポイントを配置して、アダプターの種類を確認することができます。

また、メソッド名が getCheckedItems() であるため、単純にgetListView().getCheckedItemIds()を使用し、choiceMode を single または multiple に設定していることを確認することもお勧めします。

編集:あなたのアプローチは実際にはカーソルを必要としないので、返された listadapter を使用しないのはなぜですか? getListAdapter()。getItemId () はあなたの ID を返します。

于 2012-08-23T14:32:48.350 に答える