我使用布局中最简单的方法来定义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" />
由于我需要一个选中的列表,我在listitem模板中使用CheckedTextView
。用户可以根据需要检查列表中的多个项目。它工作正常。
我有一个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
将是其他视图类(如产品,客户端等)的父级。 abstract renderlistview()将由{{1>的子项实现例如:
SimpleCursorAdapter
ActivityProductList 正常运行。 用户可以完成所有操作,然后单击在父类中定义和实现的FINISH按钮,列表视图也是如此。他的事件处理程序如下:
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 );
}
}
概念是:获取所选项目的ID。
然而,在我标记为注释的行中,程序崩溃并出现错误:
this.getListAdapter()给我一个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() );
}
}
,但演员表会崩溃。
有人可以帮帮我吗?
答案 0 :(得分:0)
如果没有更多信息,很难说你为什么会遇到这个问题。您可以调试代码并在注释错误行中添加一个断点,然后查看适配器的类型。
我还建议,因为你的方法名是getCheckedItems(),只需使用getListView().getCheckedItemIds(),只需确保你已将你的choiceMode设置为单个或多个。
编辑: 由于您的方法并不真正需要游标,为什么不使用返回的listadapter? getListAdapter()。getItemId()将返回您的id。
答案 1 :(得分:0)
我用剑解决了这个问题......
我试图从父类(ActivityList)访问SimpleCursorAdapter。这种方式不起作用。因此,I§ve将基类更改为抽象,并添加一个抽象方法,该方法将返回所选行id。抽象方法在子类(ActivityProductList)中实现。
我知道这个解决方案没有提到原始问题。但它有效......
谢谢大家的回复。