如何使用android搜索在数组列表中搜索?

如何使用android搜索在数组列表中搜索?,android,arrays,search,Android,Arrays,Search,我目前有一个可扩展的列表,我想能够搜索。我一直在遵循android开发者网站上的指南,但我被实际的方法和结果所困扰 1) 我的搜索方法叫做doMySearch 2) 我想搜索子数组 可扩展列表的代码 包com.sammy.umass import android.app.ExpandableListActivity; import android.app.SearchManager; import android.content.Intent; import android.net.Uri; i

我目前有一个可扩展的列表,我想能够搜索。我一直在遵循android开发者网站上的指南,但我被实际的方法和结果所困扰

1) 我的搜索方法叫做doMySearch 2) 我想搜索子数组

可扩展列表的代码 包com.sammy.umass

import android.app.ExpandableListActivity;
import android.app.SearchManager;
import android.content.Intent;
import android.net.Uri;
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.view.Window;
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);
    //setContentView(R.layout.directions);
    this.requestWindowFeature(Window.FEATURE_NO_TITLE);
    setDefaultKeyMode( DEFAULT_KEYS_SEARCH_LOCAL);
    Intent intent = getIntent();
    if (Intent.ACTION_SEARCH.equals(intent.getAction()))
    {
      String query = intent.getStringExtra(SearchManager.QUERY);
      doMySearch(query);
    }
    // Set up our adapter
    mAdapter = new MyExpandableListAdapter();
    setListAdapter(mAdapter);
    registerForContextMenu(getExpandableListView());
}

private void doMySearch(String query) 
{
    //Search Method

}

@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", "   Research & Labs", "   Dining Commons", "   Points of Interest","   Adminstriation",
            "   Central","   North Apartments","   Northeast","   Orchard Hill","   Southwest","   Sylvan"};
    private String[][] children = {
            //Academic Buildings
            { "Arnold House","Barlett Hall","Berkshire House","Blaisdell House","Bowditch Hall","Clark Hall","Draper Hall","Duda Hall","East Experiment Station",
                "Fernal Hall","French Hall","Furcolo Hall","H. Alfond Management Center","Hampshire House","Herter Hall","Hillis House",
                "Holdsworth Hall","Isenberg School Of Management","Machmer Hall","Marcus Hall","Marston Hall","Middlesex House","Montague House",
                "Munson Hall","New Africa House","Skinner Hall","South College","Stockbridge/Bowker","Studio Arts Building","Thompson Hall","Tobin Hall",
                "West Experiment Station"},
            //Research and Labs
            { "Agricultural Engineering","Apiary Laboratory","Astronomy Building","Chenoweth Laboratory","Computer Science Building",
            "Conte Polymer Research Building","Engineering Laboratory 1","Engineering Laboratory 2","Flint Laboratory","Goessmann Laboratory",
            "Gunness Laboratory","Hasbrouck Laboratory","Hatch Laboratory","Integrated Science Building","Knowles Engineering Research Building",
            "Lederle Graduate Reaserch Building","Morrill Science Center","Paige Laboratory","Thayer ANimal Disease Laboratory","W.E.B. Du Bois Library"},
            //Dining Commons
            { "Berkshire", "Franklin","Hampden","Hampshire","Worcester" },
            //Points of Interest
            { "Bowditch Lodge","Boyden Gym","Campus Center/Hotel","Curry Hicks","Durfee Conservatory","Farley Lodge","Fine Arts Center","Grinnell Arena",
                "Haigis Mall","Mahar Auditorium","McGuirk Alumni Stadium","Mullins Center","Observatory","Old Chapel","Recreation Center","Student Union",
                "Totman Gym","Vistor's Center"},
            //Administration
            { "Army ROTC Building", "Auxiliary Services Food Store","Campus Center Parking","Chancellor's House","Cold Storage Building",
                    "Police Department","Forest and Parks Building","Goodell","Physical Plant","PVTA Transit Facility","Research Administration",
                    "Shade Tree Lab","Textbook Annex","University Health Services","Whitmore Administration"},
            //Central
            { "Baker", "Brett","Butterfield","Chadbourne","Gorman","Greenough","Van Meter","Wheeler" },
            //North Apartments
            { "North A", "North B","North C","North D" },
            //Northeast
            { "Crabtree", "Dwight","Hamlin","Johnson","Knowlton","Leach","Lewis","Mary Lyon","Thatcher" },
            //Orchard Hill
            { "Dickinson", "Field","Grayson","Webster" },
            //Southwest
            { "Cance", "Coolidge","Crampton","Emerson","James","John Adams","John Quincy Admas","Kennedy","MacKimmie","Melville","Moore","Patteron",
                "Pierpont","Prince","Thoreau","Washington" },
            //Sylvan
            { "Brown", "Cashin","McNamara"},

    };

    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(final int groupPosition,final 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);
          }


    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;
    }



}
}

首先,您的帖子很难阅读,因为您发布的代码比回答问题所需的代码多得多

无论如何,子数组在
BaseExpandableListAdapter
中声明为私有成员变量。您尚未提供从不同类(即
DirectionsScreenActivity
)访问阵列的任何工具,因此您需要为
DirectionsScreenActivity
提供某种方法来访问阵列,然后才能对其执行任何操作

一种方法是创建一个只返回数组的公共(或受保护)方法,但这可能会提供太多的访问

我要做的是将搜索方法移动到
MyExpandableListAdapter
ie

public [some meaningful return type] doSearch(String query)
{
      // Search code
}
不要在
DirectionsScreenActivity
中调用
doMySearch()
——而是通过
MyExpandableListAdapter
的实例调用
doSearch()
(因为它已经有了您的数组),并对结果执行您需要执行的任何操作,例如:

if (Intent.ACTION_SEARCH.equals(intent.getAction()))
{
  String query = intent.getStringExtra(SearchManager.QUERY);
  [some meaningful type] result = mAdapter.doSearch(query);

  // Do something with the result
}
至于如何进行搜索,这只是标准Java,而不是特定于Android的。Java中有无数个基本搜索算法的例子,所以我在这里不详细介绍

作为补充说明,通过使用对
String-->列表
进行哈希运算的字典/哈希表,您可能会获得更好的性能。键是组,值是子项列表


这样,如果有人正在查找所有的管理大楼,您可以在固定时间内获取管理大楼列表(只需使用“Administration”键从哈希表中检索列表[value])。查找名为的建筑组有点棘手,在最坏的情况下,需要迭代哈希表中的所有项。

因为这似乎是家庭作业,我将再添加一个提示:不要在Java中使用
==
进行字符串比较。使用
string1.equals(另一个字符串)