对于EfficientAdapter我需要在onListItemClick下使用哪些代码来获取所选项目的文本? 我试过了:
str=(String) ((TextView)l.getItemAtPosition(position)).getText()
但这只会带来CastException,因为它会获取包含textview和imageview的LinearLayout视图(参见代码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 :(得分:1)
您的问题中没有足够的信息(请参阅上面的评论),但这里有一个答案的猜测:
首先,getText()
是documented以返回CharSequence,而不是String。它可能返回一个String,但你不知道它确实如此。所以写一下会更安全:
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();
}
如果您仍然遇到问题,请复制并粘贴您获得的例外情况的追溯。