Java 如何使可扩展列表的子项可单击并执行某些操作?

Java 如何使可扩展列表的子项可单击并执行某些操作?,java,android,listener,Java,Android,Listener,嗨,我只是想知道我怎样才能成为一个倾听者。我想让它成为这样当一个孩子点击它打开谷歌导航。我有这个代码来做这件事 Intent i = new Intent(Intent.ACTION_VIEW, Uri.parse("google.navigation:q=Hemsworth+Pontefract")); startActivity(i); 但是我怎样才能让孩子听到咔嗒声呢 可扩展列表代码 package com.sammy.umass; import android.app.Expanda

嗨,我只是想知道我怎样才能成为一个倾听者。我想让它成为这样当一个孩子点击它打开谷歌导航。我有这个代码来做这件事

Intent i = new Intent(Intent.ACTION_VIEW,
Uri.parse("google.navigation:q=Hemsworth+Pontefract"));
startActivity(i);
但是我怎样才能让孩子听到咔嗒声呢

可扩展列表代码

package com.sammy.umass;

import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.Gravity;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.ContextMenu.ContextMenuInfo;
import android.widget.AbsListView;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.ExpandableListView.ExpandableListContextMenuInfo;


public class DirectionsScreenActivity extends ExpandableListActivity {
ExpandableListAdapter mAdapter;

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

    // Set up our adapter
    mAdapter = new MyExpandableListAdapter();
    setListAdapter(mAdapter);
    registerForContextMenu(getExpandableListView());
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    menu.setHeaderTitle("Sample menu");
    menu.add(0, 0, 0, R.string.expandable_list_sample_action);
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();

    String title = ((TextView) info.targetView).getText().toString();

    int type = ExpandableListView.getPackedPositionType(info.packedPosition);
    if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition); 
        Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos,
                Toast.LENGTH_SHORT).show();
        return true;
    } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 
        Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}

/**
 * A simple adapter which maintains an ArrayList of photo resource Ids. 
 * Each photo is displayed as an image. This adapter supports clearing the
 * list of photos and adding a new photo.
 *
 */
public class MyExpandableListAdapter extends BaseExpandableListAdapter {
    // Sample data set.  children[i] contains the children (String[]) for groups[i].
    private String[] groups = { "   Academic Buildings", "   Residential Buildings", "   Dining Commons", "   All Buildings A-Z" };
    private String[][] children = {
            { "Agricultural Engineering Bldg", "Army ROTC Bldg", "Arnold House", "(Studio) Arts Building" },
            { "Baker Hall", "Brett Hall", "Brooks Hall", "Brown Hall" },
            { "Berkshire", "Franklin","Hampden","Hampshire","Worcester" },
            { "Agricultural Engineering Bldg", "Army ROTC Bldg", "Arnold House", "(Studio) Arts Building" }
    };

    public Object getChild(int groupPosition, int childPosition) {
        return children[groupPosition][childPosition];
    }

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

    public int getChildrenCount(int groupPosition) {
        return children[groupPosition].length;
    }

    public TextView getGenericView() {
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
                ViewGroup.LayoutParams.MATCH_PARENT, 64);

        TextView textView = new TextView(DirectionsScreenActivity.this);
        textView.setLayoutParams(lp);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        // Set the text starting position
        textView.setPadding(36, 0, 0, 0);
        return textView;
    }

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
            View convertView, ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getChild(groupPosition, childPosition).toString());
        return textView;
    }

    public Object getGroup(int groupPosition) {
        return groups[groupPosition];
    }

    public int getGroupCount() {
        return groups.length;
    }

    public long getGroupId(int groupPosition) {
        return groupPosition;
    }

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
            ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getGroup(groupPosition).toString());
        return textView;
    }

    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

    public boolean hasStableIds() {
        return true;
    }



}
}

谢谢

您需要修改getChildView函数,如下所示:

public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
        View convertView, ViewGroup parent) {
    TextView textView = getGenericView();
    textView.setText(getChild(groupPosition, childPosition).toString());
    textView.setOnClickListener(new View.OnClickListener(){
      public void onClick(View view){
        Uri uriToOpen = getUriForView(groupPosition, childPosition);
        Intent i = new Intent(Intent.ACTION_VIEW, uriToOpen);
        startActivity(i);
      });

    return textView;
}
因为您希望uri依赖于视图本身,所以只需编写一个小函数,根据视图的组位置和子位置返回适当的uri


此外,如果可能的话,您应该尝试在get-child视图中重用convertView。这将防止设备需要进行过多的垃圾收集。它只是让你的应用程序运行更顺畅。查看此文件以获得进一步解释。

谢谢!非常感谢你的帮助!如何为每个孩子设置不同的位置(如Hemsworth+Pontefract)?此外,我完全按照您的意思使用ConvertView编辑了我的答案,包括您在评论中提出的两个问题的答案。@KurtisNusbaum当我这样做时,我的上下文菜单将停止显示,