2013-02-23 51 views
0

我有這個下面的代碼如何在android中讀取android.R.id.text2?

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上,您可以檢索具有單擊項目的視圖ID的相應對象。

@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)和i猜測它會工作

0

看到的onItemClick簽名:

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

可以使用被選擇的第三個爲項目的位置,並用這個值作爲賓夕法尼亞州呼叫getItem() rameter。

無論你做什麼,都不要使用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)); 
      } 
     }); 
+0

謝謝,但這樣做沒有返回數只選擇了該id路徑。我試過'.toString()'也沒有幫助。 – 2013-02-24 11:29:55

+0

@AhmedDurrani實際上確實有效。它返回一個CursorWrapper的實例。我已經更新了我的答案,以顯示如何從這個單一項目獲取所有可以使用的信息。順便說一句,在你的代碼中有許多被棄用的方法和類。不知道有什麼選擇,但你可以隨時使用你自己的實現(使用baseAdapter)。 - – 2013-02-26 20:40:56