我有以下代码
public class Contacts extends ListActivity {
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor cursor = getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
startManagingCursor(cursor);
String[] from = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
ContactsContract.CommonDataKinds.Phone.NUMBER,
ContactsContract.CommonDataKinds.Phone._ID };
int[] to = { android.R.id.text1, android.R.id.text2 };
ListAdapter listadapter = new SimpleCursorAdapter(this,
android.R.layout.simple_list_item_multiple_choice, cursor,
from, to);
setListAdapter(listadapter);
lv = getListView();
lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
lv.setItemsCanFocus(false);
lv.setTextFilterEnabled(true);
final int check = lv.getCheckedItemPosition();//lv.getCheckedItemIds();
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
TextView tv = (TextView) arg1.findViewById(android.R.id.text2);
String aa = (String) tv.getText();
String ab = lv.getItemAtPosition(arg2).toString();
int ac = lv.getSelectedItemPosition();
System.out.println("wow "+ab +" ww "+ ac + " "+ aa);
Toast.makeText(Contacts.this, ((TextView) arg1).getText(), Toast.LENGTH_LONG).show();
}
});
}
}
我想读ListView
中的数字部分,到目前为止我还没能做到。我甚至试过TextView tv = (TextView) arg1.findViewById(android.R.id.text2);
String test = tv.getText().toString();
但我总是得到NullPointerException
基本上,我想从我手机的联系人列表中提取所有联系人,这样我就可以一次选择多个联系人。救命!
问题是您使用的是android.R.layout.simple_list_item_multiple_choice
,它不包含任何id为android.R.id.text2
的TextView
。布局包含以下内容(至少在某些设备上(:
<CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/text1"
android:layout_width="match_parent"
android:layout_height="?android:attr/listPreferredItemHeight"
android:textAppearance="?android:attr/textAppearanceListItem"
android:gravity="center_vertical"
android:checkMark="?android:attr/listChoiceIndicatorMultiple"
android:paddingLeft="8dip"
android:paddingRight="8dip"
/>
您应该为列表项创建自定义布局。
还要注意,使用私有布局和其他资源(android.R
类中的资源(通常是个坏主意,你不能确定它们是否存在于所有设备和Android版本上。
如果您想要获取的数据在ListView中,则您在ListAdapter上有相同的数据,因此在itemClick上,您可以检索具有所单击项目的视图id的相应对象。
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
int id = arg1.getItemId();
listadapter.getItem(id);
...
...
}
我想setcontentview(R.id.yourlayout(不是在oncreate((中创建的所以程序每次都会给你空指针异常。。。只需设置setcontentview(R.id.yourlayout(,我猜它会在
查看onItemClick:的签名
public abstract void onItemClick (AdapterView<?> parent, View view, int position, long id)
您可以使用第三个值作为所选项目的位置,并使用该值作为参数调用getItem((。
无论你做什么,都不要使用findViewById,因为它对listview来说是错误的。错误的原因是listView重新使用旧视图,以便使用最少数量的视图(与任何时候显示的视图数量大致相同(。
编辑:
这里有一个例子,你可以用我写的东西做什么:
lv.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(final AdapterView<?> arg0,final View arg1,final int arg2,final long arg3)
{
final Object item=listadapter.getItem(arg2);
final CursorWrapper cursorWrapper=(CursorWrapper)listadapter.getItem(arg2);
final int columnCount=cursorWrapper.getColumnCount();
for(int i=0;i<columnCount;++i)
Log.d("DEBUG",cursorWrapper.getColumnName(i)+":"+cursorWrapper.getString(i));
}
});