单击EfficientAdapter并抓取项目文本

时间:2010-12-24 01:04:48

标签: android

对于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());
}

}

1 个答案:

答案 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();
}

如果您仍然遇到问题,请复制并粘贴您获得的例外情况的追溯。