2010-12-24 44 views
0

對於EfficientAdapter我需要在onListItemClick下使用哪些代碼來獲取所選項目的文本? 我想:EfficientAdapter並獲取點擊文本的項目

str=(String) ((TextView)l.getItemAtPosition(position)).getText() 

但這隻會帶來CastException,因爲它取了的LinearLayout視圖持有的TextView和ImageView的(見代碼here

請幫幫忙!

某些代碼:

public class Bookmarks extends ListActivity { 
public static Typeface mFace; 
public EfficientAdapter eff; 

private static class EfficientAdapter extends BaseAdapter { 
    private LayoutInflater mInflater; 

    public EfficientAdapter(Context context) { 
     mInflater = LayoutInflater.from(context); 
    } 

    public int getCount() { 
     return DAT.length; 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.list_item_text, null); 
      holder = new ViewHolder(); 
      holder.text = (TextView) convertView.findViewById(R.id.text); 
      holder.text.setTypeface(mFace); 

      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 
     holder.text.setText(DAT[position]); 

     return convertView; 
    } 

    static class ViewHolder { 
     TextView text; 
    } 
} 

public Object getItem(int position) { 
    return position; 
} 

public void onResume(Bundle icicle) { 
    eff.notifyDataSetChanged(); 
} 

protected void onListItemClick(ListView l, View v, int position, long id) { 
    //////////CRASHES on next line!!!!!!!!!!!!!!!!!! 
TextView tv = (TextView) l.getItemAtPosition(position); 
    String str = tv.getText().toString(); 

} 


@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    eff = (new EfficientAdapter(this)); 
    setListAdapter(eff); 
    registerForContextMenu(getListView()); 
} 

}

+0

如果您發佈了點擊處理程序的完整代碼,尤其是類和函數定義,這將有所幫助。 – 2010-12-24 01:23:25

回答

1

是不是真的有足夠的信息,在你的問題(見上面我的意見),但在這裏是在回答一個猜測:

首先,getText()documented返回一個CharSequence,而不是一個字符串。它可能返回一個字符串,但你不知道它的確如此。因此,這將是更安全的寫:

str = ((TextView)l.getItemAtPosition(position)).getText().toString() 

第二,如果還是不行,請嘗試打破這種說法,讓你可以在異常從哪裏來的一個更好的主意。像這樣的東西,也許,可能是更清晰:基於您的更新

TextView tv = (TextView) l.getItemAtPosition(position); 
str = tv.getText().toString(); 

編輯

1)如果你要實現onListItemClick,要確保你通過調用開始方法到基類,如下所示。

2)這裏的問題:(我意識到這在不同的例子複製和粘貼後,我認爲現在沒有必要):ListView.getItemAtPosition不返回查看所有;它會從你的適配器(一個光標,一個數組入口等等)返回一個項目。要獲得TextView,你需要使用findViewById,或者更好的是你的ViewHolder。我認爲這會工作:

protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    ViewHolder holder = (ViewHolder) v.getTag(); 
    TextView tv = holder.text; 
    String str = tv.getText().toString(); 
} 

如果你仍然有問題,請複製並粘貼你得到異常的回溯。

+0

非常感謝!看起來很不錯我去了簡單的方法。我創建了一個只需要位置的公共字符串數組。 – OkyDokyman 2010-12-24 06:13:26

相關問題