0

我有以下代码

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 基本上我总是想从手机的联系人列表中获取所有联系人,这样我就可以一次选择多个联系人。请帮忙!

4

4 回答 4

1

问题是您正在使用android.R.layout.simple_list_item_multiple_choice,其中不包含任何TextView带有 id的内容android.R.id.text2。布局包含以下内容(至少在某些设备上):

<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 版本上。

于 2013-02-23T21:27:44.053 回答
0

如果您要获取的数据在 ListView 中,则您在 ListAdapter 上具有相同的数据,因此在 itemClick 上,您可以检索具有单击项目的视图 id 的相应对象。

@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
    int id = arg1.getItemId();
    listadapter.getItem(id);
    ...
    ...
}
于 2013-02-23T21:29:05.893 回答
0

我猜 setcontentview(R.id.yourlayout) 不是在 oncreate() 中创建的,所以程序每次都会给你空指针异常......只需设置 setcontentview(R.id.yourlayout) 我猜它会起作用

于 2013-02-23T21:30:10.337 回答
0

查看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));
          }
      });
于 2013-02-23T21:43:37.543 回答