0

我用最简单的布局方式来定义listview:

<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。

但是,在我用注释标记的行中,程序崩溃并出现错误: eclipse截图部分

this.getListAdapter ()给了我一个CursorAdapter比演员表崩溃的结果。

有人可以帮我吗?

4

2 回答 2

0

在没有更多信息的情况下,很难说你为什么会遇到这个问题。您可以调试您的代码并在注释错误行放置一个断点,然后查看适配器的类型。

我还建议,由于您的方法名称是 getCheckedItems(),因此只需使用getListView().getCheckedItemIds(),只需确保已将您的choiceMode 设置为单个或多个。

编辑:由于您的方法实际上并不需要光标,为什么不直接使用返回的 listadapter 呢?获取列表适配器()。getItemId () 将返回您的 id。

于 2012-08-23T14:32:48.350 回答
0

我用剑解决了问题...

我试图从父类(ActivityList)访问 SimpleCursorAdapter。这种方式没有奏效。因此,我将基类更改为抽象并添加一个抽象方法,该方法将返回选定的行 ID。抽象方法在子类(ActivityProductList)中实现。

我知道这个解决方案没有提到原始问题。但它的工作...

谢谢大家的回复。

于 2012-08-28T13:25:49.587 回答