将变量值从BaseExpandableListAdapter类传递到新活动

时间:2012-12-30 23:24:35

标签: android

我有ExtendableListAdapter类的以下代码,它扩展到BaseExpandableListAdapter。 我试图将String变量“FullTrainsURL”的值传递给新的Activity。正如您在代码中看到的那样,每个子列表项的URL值不同,并且使用OnClick()函数追加特定代码。 我试过了

Intent i = new Intent(AdapterForStations.this, TestMain.class);

Bundle b = new Bundle();

b.putString("url", fullTrainsURL);

i.putExtras(b);

startActivity(i);    //Gives error at this line...

但是,我希望将变量转移到新活动的类扩展到“Activity”之外的“BaseExpandableListAdapter”。我认为这是我无法使用intent.putExtras();方法,我得到错误。

您能否指导我如何使用OnClick()方法将“fullTrainsURL”变量传输到新活动。

:::::我的实际文件代码:::::

package com.multilayerexpandable.view;

import java.util.ArrayList;
import java.util.LinkedList;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.CheckedTextView;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;

import com.javacodegeeks.android.xml.pull.R;
import com.javacodegeeks.android.xml.pull.XmlParsingStationsData;
import com.javacodegeeks.android.xml.pull.model.Station;

@SuppressWarnings("unchecked")
public class AdapterForStations extends BaseExpandableListAdapter {

private static final String baseUrlForTrains = "http://cloud.tfl.gov.uk/TrackerNet/PredictionDetailed/";

XmlParsingStationsData parsingStations = new XmlParsingStationsData();
MainStationsActivity stationActivity = new MainStationsActivity();
LinkedList<Station> stationsList = new LinkedList<Station>();

public ArrayList<String> groupItem, tempChild;
public ArrayList<Object> Childtem = new ArrayList<Object>();
public LayoutInflater minflater;
public Activity activity;
private final String TAG = getClass().getSimpleName();



public AdapterForStations(ArrayList<String> grList, ArrayList<Object> childItem) {
    groupItem = grList;
    this.Childtem = childItem;
}

public void setInflater(LayoutInflater mInflater, Activity act) {
    this.minflater = mInflater;
    activity = act;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return null;
}

@Override
public long getChildId(int groupPosition, int childPosition) {
    return 0;
}

@Override
public View getChildView(final int groupPosition, final int childPosition,
    boolean isLastChild, View convertView, ViewGroup parent) {
    tempChild = (ArrayList<String>) Childtem.get(groupPosition);

    Log.d(TAG, "::::::::::::::::::::DATA:::::::::::::::::::\n" + "<<<<<<" + tempChild.get(childPosition) + ">>>>>>\n");

    TextView text = null;
    if (convertView == null) {
        convertView = minflater.inflate(R.layout.childrow, null);
    }
    text = (TextView) convertView.findViewById(R.id.textView1);
    text.setText(tempChild.get(childPosition));
    convertView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {

            StringBuilder trainsUrl = new StringBuilder(baseUrlForTrains);
            String fullTrainsURL = "";

                if(groupItem.get(groupPosition).equals("BAKERLOO LINE")){
                String stationCode = tempChild.get(childPosition).substring(tempChild.get(childPosition).length()-4, tempChild.get(childPosition).length()-1);
                trainsUrl.append("B/").append(stationCode);
                fullTrainsURL = trainsUrl.toString();

                Intent i = new Intent(AdapterForStations.this, TestMain.class);
                Bundle b = new Bundle();
                b.putString("url", fullTrainsURL);
                i.putExtras(b);
                startActivity(i);


            } else if(groupItem.get(groupPosition).equals("CENTRAL LINE")){
                String stationCode = tempChild.get(childPosition).substring(tempChild.get(childPosition).length()-4, tempChild.get(childPosition).length()-1);
                trainsUrl.append("C/").append(stationCode);
                fullTrainsURL = trainsUrl.toString();


            } else if(groupItem.get(groupPosition).equals("CIRCLE LINE")){
                String stationCode = tempChild.get(childPosition).substring(tempChild.get(childPosition).length()-4, tempChild.get(childPosition).length()-1);
                trainsUrl.append("H/").append(stationCode);
                fullTrainsURL = trainsUrl.toString();


            }

            Toast.makeText(activity, fullTrainsURL,
                    Toast.LENGTH_SHORT).show();
            }

    });
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return ((ArrayList<String>) Childtem.get(groupPosition)).size();
}

@Override
public Object getGroup(int groupPosition) {
    return null;
}

@Override
public int getGroupCount() {
    return groupItem.size();
}

@Override
public void onGroupCollapsed(int groupPosition) {
    super.onGroupCollapsed(groupPosition);
}

@Override
public void onGroupExpanded(int groupPosition) {
    super.onGroupExpanded(groupPosition);
}

@Override
public long getGroupId(int groupPosition) {
    return 0;
}

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = minflater.inflate(R.layout.grouprow, null);
    }
    ((CheckedTextView) convertView).setText(groupItem.get(groupPosition));
    ((CheckedTextView) convertView).setChecked(isExpanded);
    return convertView;
}

@Override
public boolean hasStableIds() {
    return false;
}

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return false;
}

}

3 个答案:

答案 0 :(得分:4)

startActivity()是Context类的成员,尝试这样的事情:

Context context = v.getContext();
Intent i = new Intent(context, TestMain.class);
i.putExtra("url", fullTrainsURL);
context.startActivity(i);

此外,您不需要创建第二个Bundle,只需将String直接添加到Intent的内置Bundle中。

答案 1 :(得分:1)

Errrr ...适配器不是活动,它们用于保存数据并提供AdapterViews(例如ListView)的视图。他们将数据调整为View。您需要创建一个活动,该活动具有使用您的AdapterForStations的listview并改为启动它。

适配器的构造函数通常应包含它所需的所有数据。

答案 2 :(得分:0)

正如其他答案所指出的那样:适配器仅用于以有效的方式将数据绑定到视图。因此,它并不意味着包含任何用户交互代码。

幸运的是,您的适配器应设置为ExpandableListActivityExpandableListView,并且这些适配器可以提供轻松响应的适配器,例如用户点击项目。请参阅以下相关方法:

(如果您需要,您还可以收听“群组”项目的点击次数)

使用上述方法之一,您可以复制粘贴适配器中OnClickListener当前的大部分内容。您可能只需要更改从中获取数据对象的位置。

由于您将在ActivityFragment中设置包含ExpandableListView(并且都扩展为Context)的侦听器,因此您可以拨打{{1}马上。