2014-03-27 28 views
0

我有具有以下幾行代碼自定義光標適配器CAdapter得到一個TextView文本:不能在ListView

public class CAdapter extends CursorAdapter { 

    public CAdapter(Context context, Cursor c) { 
     super(context, c); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     TextView titleTV = (TextView) view.findViewById(R.id.listTitle); 
     titleTV.setText("#"+cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1)))+" "+ 
       cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)))); 
    } 

    @Override 
    public View newView(Context context, Cursor cursor, ViewGroup parent) { 

     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     View retView = inflater.inflate(R.layout.row_item_layout, parent, false); 
     return retView; 
    } 

} 

row_item_layout.xml文件

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="fill_parent" 
       android:orientation="vertical"> 

    <TextView 
     android:id="@+id/listTitle" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:layout_marginTop="2dp" 
     android:layout_toRightOf="@+id/heartIV" 
     android:focusable="false" 
     android:gravity="center_vertical" 
     android:text="Example application" 
     android:textSize="26sp" 
     android:paddingBottom="3dp"/> 

    <ImageView 
     android:id="@+id/heartIV" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignTop="@+id/listTitle" 
     android:src="@drawable/heart" 
     android:paddingRight="5dp" 
     android:paddingLeft="2dp"/> 

</RelativeLayout> 

活動FavListActivity顯示列表。它的佈局文件是:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/container" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.xkcdreader.FavListActivity" 
    tools:ignore="MergeRootFrame" > 

    <ListView 
     android:id="@+id/favL" 
     android:layout_width="match_parent" 
     android:layout_height="452dp" 
     android:layout_alignParentBottom="true" 
     android:layout_below="@+id/headingTV" > 

    </ListView> 

    <TextView 
     android:id="@+id/headingTV" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentTop="true" 
     android:layout_marginLeft="8dp" 
     android:text="Favourites" 
     android:textSize="25dp" /> 

</RelativeLayout> 

以下是代碼FavListActivity

listView = (ListView) findViewById(R.id.favL); 
listView.setOnItemClickListener(new OnItemClickListener() {   
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       Log.d("App", "clicked on item: " + position); 
       TextView listTV=(TextView) view.findViewById(R.id.titleTV); 
       Log.d("App",listTV.getText().toString()); 
      } 
     }); 

節在運行這個我在行Log.d( 「應用程序」,listTV.getText()得到NullPointerException異常。的toString());該列表沒有任何空textview。我無法弄清楚這個問題。請幫助

+0

你能告訴我爲什麼你想調用istTV.getText()而不是從模型中獲取數據嗎? – pskink

回答

0

row_item_layou.xml中沒有TextView,編號爲titleTV。所以當你初始化時你最終得到NUllPointerException

更改此

TextView listTV=(TextView) view.findViewById(R.id.titleTV); 

TextView listTV=(TextView) view.findViewById(R.id.listTitle); 

,因爲你有

<TextView 
    android:id="@+id/listTitle" // id is listTitle 

雖然你的NPE可以如上你最好使用blackbet的答案來解決

Cursor mycursor = (Cursor)parent.getItemAtPosition(position); 

然後使用mycursor獲取字符串。

+0

謝謝!多麼愚蠢的錯誤! –

+0

這是爲什麼downvoted ?. NPE是引用了錯誤ID的bcoz。我同意黑帶答案更好。這並不是完全錯誤的 – Raghunandan

0

試試這個..

TextView ID是listTitle但你提到titleTV更改,並嘗試它。

listView.setOnItemClickListener(new OnItemClickListener() {   
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Log.d("App", "clicked on item: " + position); 
      TextView listTV=(TextView) view.findViewById(R.id.listTitle); 
      Log.d("App",listTV.getText().toString()); 
     } 
    }); 
2

你應該使用getItemAtPosition

listView.setOnItemClickListener(new OnItemClickListener() {   
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
      Cursor mycursor = (Cursor)parent.getItemAtPosition(position); 
     } 
    }); 

,並使用myCursor訪問您的數據。