2013-02-23 1 views
0

У меня есть этот следующий кодКак читать android.R.id.text2 в android?

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 в основном я хочу, чтобы объединить все контакты из списка контактов моего телефона, чтобы я мог выбрать несколько контактов одновременно. Помогите пожалуйста!

ответ

1

Проблема в том, что вы используете android.R.layout.simple_list_item_multiple_choice, который не содержит TextView с идентификатором 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.

0

Если данные, которые вы хотите получить, находятся в ListView, у вас есть те же данные в ListAdapter, поэтому на itemClick вы можете получить соответствующий объект с идентификатором вида щелкнутого элемента.

@Override 
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { 
    int id = arg1.getItemId(); 
    listadapter.getItem(id); 
    ... 
    ... 
} 
0

я думаю, setcontentview (R.id.yourlayout) не создается в OnCreate() поэтому программа дает исключения нулевого указателя каждый раз ... просто установить setcontentview (R.id.yourlayout) и я предполагаю, что это будет работать

0

см подпись onItemClick:

public abstract void onItemClick (AdapterView<?> parent, View view, int position, long id) 

вы можете использовать третий в качестве положения пункта выбран, и вызовите getItem() с этим значением, как ра гос.

независимо от того, что вы делаете, не используйте findViewById, поскольку это просто неправильно для listview. причина, по которой это неверно, заключается в том, что listView повторно использует старые представления, чтобы использовать минимальное количество просмотров (примерно столько же просмотров, которые отображаются в любое время).


EDIT:

вот пример того, что вы можете сделать с тем, что я написал:

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)); 
      } 
     }); 
+0

Спасибо за ответ, но при этом не возвращает номер только идентификатор, что выбранный дорожка. Я попробовал '.toString()' тоже не помог. –

+0

@AhmedDurrani на самом деле это действительно работа. он возвращает экземпляр CursorWrapper. Я обновил свой ответ, чтобы показать, как получить всю информацию, которую вы можете использовать из этого отдельного элемента. Кстати, в вашем коде много устаревших методов и классов. не знаю, каковы альтернативы, но вы всегда можете использовать свою собственную реализацию (используя baseAdapter). - –