来自DB Column的ListView .putExtra

时间:2011-04-30 01:02:42

标签: android listview adapter android-intent

我正在尝试从包含URL链接的db列获取数据;列名是db中的'goto'w /。我需要将它传递到我的ListView中的onItemClick Intent,以将网页加载到新的/下一个Activity中。

我不知道如何让它发挥作用。如果你能用解释显示代码修改,这对我学习非常有帮助。日Thnx!

REVISED:

我现在正在传递数据,但我的方法返回了错误的行ID。我修改了以下活动。任何帮助Plz。日Thnx

在我的活动中.onCreate(已修订):

final ListView lv = getListView();
lv.setTextFilterEnabled(true);
    lv.setOnItemClickListener(new OnItemClickListener() {
        // @Override
        public void onItemClick(AdapterView<?> a, View v, int position,long id) 
        {
            Object o = lv.getSelectedItem();
            //Adapter_AC fullObject = (Adapter_AC)o;

            String url = "gotoURL";
            if(v != null) {
                TextView tv = (TextView)lv.findViewById(R.id.dummy);
                url = (String) tv.getTag();
            }

            Toast.makeText(List_AC.this, "Clicked: " +  url, Toast.LENGTH_LONG).show();
            Intent i = new Intent(List_AC.this, DocView.class);

            i.putExtra("url", url);
            startActivity(i);
        }
    });

我的适配器:

public class Adapter_AC extends SimpleCursorAdapter {
private Cursor dataCursor;

private LayoutInflater mInflater;

public Adapter_AC(Context context, int layout, Cursor dataCursor,
        String[] from, int[] to) {
    super(context, layout, dataCursor, from, to);
    this.dataCursor = dataCursor;
    mInflater = LayoutInflater.from(context);
}

public View getView(int position, View convertView, ViewGroup parent) {

    ViewHolder holder;

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);

        holder = new ViewHolder();
        holder.text1 = (TextView) convertView.findViewById(R.id.label);
        holder.text2 = (TextView) convertView.findViewById(R.id.listTitle);
        holder.text3 = (TextView) convertView.findViewById(R.id.caption);

        convertView.setTag(holder);
    } else {
        holder = (ViewHolder) convertView.getTag();
    }

    dataCursor.moveToPosition(position);

    int label_index = dataCursor.getColumnIndex("label");
    String label = dataCursor.getString(label_index);

    int title_index = dataCursor.getColumnIndex("title");
    String title = dataCursor.getString(title_index);

    int description_index = dataCursor.getColumnIndex("description");
    String description = dataCursor.getString(description_index);

    int goto_index = dataCursor.getColumnIndex("goto");
    String gotoURL = dataCursor.getString(goto_index);

    holder.text1.setText(label);
    holder.text2.setText(title);
    holder.text3.setText(description);

    return convertView;
}

static class ViewHolder {
    TextView text1;
    TextView text2;
    TextView text3;
}
}

3 个答案:

答案 0 :(得分:1)

尝试使用setTag:
首先,我们设置标签:

...
holder.text3.setText(description);
holder.text3.setTag(gotoURL);

执行onClick事件时,获取标记:

public void onItemClick(AdapterView<?> a, View v, int position,long id) 
{
    ...
    String url = "";
    if(v != null) {
        TextView tv = (TextView)arg1.findViewById(R.id.caption);
        url = (String) tv.getTag();
    }
    i.putExtra("url", url);
    startActivity(i);
}

答案 1 :(得分:1)

OnItemClickListener.onItemClick方法中,有id个参数,当您使用SimpleCursorAdapter时,所选项目的id,即sqlite数据库中的_ID列传递给id参数,因此您可以使用此id值从DB获取所选列。

以下是示例代码,希望它可以提供帮助。

public void onItemClick(AdapterView<?> a, View v, int position, long id) {
    Cursor c = queryById(id);
    // Get the url from DB.
    String url = c.getString("url");
}

答案 2 :(得分:0)

您从错误的行中提取数据的原因是您错误地处理了convertView参数。您只需将holder设置为指向您设置的第一组TextView个对象。我认为你的holder概念是不必要的。丢失,每次都明确设置文本字段,使用我在上一个问题中提到的Cursor