Java 初始化适配器的正确方式和位置

Java 初始化适配器的正确方式和位置,java,android,android-activity,android-adapter,android-listfragment,Java,Android,Android Activity,Android Adapter,Android Listfragment,我试图为我的列表视图设置一个过滤器,但我遇到了这些错误 无法解析符号“myAdapter” 我知道myAdapter尚未初始化,但我不知道需要在哪个类中声明它 错误:类SearchView中的方法setOnQueryTextListener无法应用于给定类型; 必需:android.support.v7.widget.SearchView.OnQueryTextListener 找到:android.widget.SearchView.OnQueryTextListener 原因:无法通过方法调

我试图为我的列表视图设置一个过滤器,但我遇到了这些错误

无法解析符号“myAdapter”

我知道myAdapter尚未初始化,但我不知道需要在哪个类中声明它

错误:类SearchView中的方法setOnQueryTextListener无法应用于给定类型; 必需:android.support.v7.widget.SearchView.OnQueryTextListener 找到:android.widget.SearchView.OnQueryTextListener 原因:无法通过方法调用转换将实际参数android.widget.SearchView.OnQueryTextListener转换为android.support.v7.widget.SearchView.OnQueryTextListener

我知道android.widget.SearchView.OnQueryTextListener无法转换为android.support.v7.widget.SearchView.OnQueryTextListener,但我不知道代码中需要更改什么。我的应用程序使用支持库。我们将不胜感激

VictoriaLineActivity.java

FragmentVictoriaLine.java


你的错误几乎可以告诉你你做错了什么:

无法解析符号“myAdapter”

这是因为您没有声明任何名为myAdapter的变量

错误:类SearchView中的方法setOnQueryTextListener不能为空 适用于给定类型;必修的: 找到android.support.v7.widget.SearchView.OnQueryTextListener: android.widget.SearchView.OnQueryTextListener原因:实际参数 无法将android.widget.SearchView.OnQueryTextListener转换为 android.support.v7.widget.SearchView.OnQueryTextListener by方法 调用转换

检查您的导入。您需要使用android.support.v7.widget.SearchView,但您使用的是标准的SearchView。这应该可以通过简单地导入正确的包来解决

编辑:

您使用的OnQueryListener类型错误,需要使用支持版本

编辑2: 希望这将帮助您开始:

public class FragmentVictoriaLine extends Fragment {
    /**Declare other variables**/

    private MyAdapter myAdapter;

    public FragmentVictoriaLine() {
        // Required empty public constructor
    }


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_victoria_line, container, false);

        //Tell the system to call onCreateOptinsMenu
        setHasOptionsMenu(true);
        if (getActivity().findViewById(R.id.detail_container) != null) {
            mTwoPane = true;
        } else {
            mTwoPane = false;
        }

        mVictoria = new Victoria[]{
            new Victoria(R.string.bank, R.string.zone_1, WCBankActivity.class, FragmentWCBank.class),
            new Victoria(R.string.wat, R.string.zone_1, WCWATActivity.class, FragmentWCWAT.class)
        };

        //Declare your adapter here so you can access later
        myAdapter = new MyAdapter(getActivity(), mVictoria);

        final ListView listView = (ListView) v.findViewById(R.id.list_victoria);
        //Set teh adapter here.
        listView.setAdapter(myAdapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setTextFilterEnabled(true);

        return v;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu items for use in the action bar
        inflater.inflate(R.menu.menu_victoria_line, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
        searchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
        {
            @Override
            public boolean onQueryTextChange(String newText)
            {
                // this is your adapter that will be filtered
                myAdapter.getFilter().filter(newText);
                System.out.println("on text chnge text: "+newText);
                return true;
            }
            @Override
            public boolean onQueryTextSubmit(String query)
            {
                // this is your adapter that will be filtered
                myAdapter.getFilter().filter(query);
                System.out.println("on query submit: "+query);
                return true;
            }
        };
        searchView.setOnQueryTextListener(textChangeListener);

    }

   /**....rest of your code*/
}
编辑3:

以下是完整的演示:

你的问题不太清楚。这将有助于明确定义问题,并可能缩小发布的代码。目前情况还不错,但可能与您的问题无关。我认为您的设置存在更大的问题。您正在访问活动中的搜索代码,但适配器属于您的片段。实际上,您可以通过调用片段中的onCreateOptionsMenuMenu菜单(而不是活动)来访问片段中的搜索视图。请不要按原样复制。这对你来说只是一个起点。系统服务只能通过上下文访问。我会更新它,但您可能需要通过完整的教程才能正确地实现它。过滤器不是一个小部件。这是你必须实现的东西,请仔细阅读教程。适配器需要实现Filterable才能调用getFilterI实际上是指搜索视图小部件,但这对操作栏中的搜索视图有效吗?是的,因为片段通过调用自己的OnCreateOptions MenuMenu菜单MenuInflater来定义操作菜单
public class FragmentVictoriaLine extends android.support.v4.app.Fragment implements {

    private class Victoria {
        private CharSequence station;
        private CharSequence zone;
        private Class<? extends Activity> activityClass;
        private Class<? extends android.support.v4.app.Fragment> fragmentClass;

        public Victoria(int stationResId, int zoneResId, Class<? extends Activity> activityClass, Class<? extends android.support.v4.app.Fragment> fragmentClass) {
            this.fragmentClass = fragmentClass;
            this.activityClass = activityClass;
            this.station = getResources().getString(stationResId);
            this.zone = getResources().getString(zoneResId);
        }

        @Override
        public String toString() { return station.toString(); }
        public String getzone(){ return zone.toString(); }
    }

    private static Victoria[] mVictoria;

    /**
     * Whether or not the activity is in two-pane mode, i.e. running on a tablet
     * device.
     */
    public boolean mTwoPane;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.fragment_victoria_line, container, false);

        if (getActivity().findViewById(R.id.detail_container) != null) {
            mTwoPane = true;
        }else{
            mTwoPane = false;
        }

        // Instantiate the list of stations.
        mVictoria = new Victoria[]{
                new Victoria(R.string.bank, R.string.zone_1, WCBankActivity.class, FragmentWCBank.class),
                new Victoria(R.string.wat, R.string.zone_1, WCWATActivity.class, FragmentWCWAT.class)

        };

        final ListView listView = (ListView)v.findViewById(R.id.list_victoria);
        listView.setAdapter(new MyAdapter(getActivity(), mVictoria));
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setTextFilterEnabled(true);

        });

        return v;
    }

    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        setHasOptionsMenu(true);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu items for use in the action bar
        MenuInflater inflater = getMenuInflater();
        inflater.inflate(R.menu.menu_victoria_line, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));
        searchView.setIconifiedByDefault(false);

        android.support.v7.widget.SearchView.OnQueryTextListener textChangeListener = new android.support.v7.widget.SearchView.OnQueryTextListener()
        {
            @Override
            public boolean onQueryTextChange(String newText)
            {
                // this is your adapter that will be filtered
                myAdapter.getFilter().filter(newText);
                return true;
            }
            @Override
            public boolean onQueryTextSubmit(String query)
            {
                // this is your adapter that will be filtered
                myAdapter.getFilter().filter(query);
                return true;
            }
        };
        searchView.setOnQueryTextListener(textChangeListener);


        return super.onCreateOptionsMenu(menu);
    }


    static class MyAdapter extends BaseAdapter {

        static class ViewHolder {
            TextView station;
            TextView zone;
        }

        LayoutInflater inflater;
        Victoria[] mVictoria;

        public MyAdapter(Context contexts, Victoria[] samples) {
            this.mVictoria = samples;
            inflater = LayoutInflater.from(contexts);
        }

        @Override
        public int getCount() {
            return mVictoria.length;
        }

        @Override
        public Object getItem(int position) {
            return mVictoria[position];
        }

        @Override
        public long getItemId(int position) {
            return 0;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.list_item_dualline, null);
                viewHolder = new ViewHolder();

                viewHolder.station = (TextView) convertView.findViewById(R.id.list_item_station);
                viewHolder.zone = (TextView) convertView.findViewById(R.id.list_item_zone);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.station.setText(mVictoria[position].station);
            viewHolder.zone.setText(mVictoria[position].getzone());

            return convertView;
        }
    }
}
public class FragmentVictoriaLine extends Fragment {
    /**Declare other variables**/

    private MyAdapter myAdapter;

    public FragmentVictoriaLine() {
        // Required empty public constructor
    }


    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_victoria_line, container, false);

        //Tell the system to call onCreateOptinsMenu
        setHasOptionsMenu(true);
        if (getActivity().findViewById(R.id.detail_container) != null) {
            mTwoPane = true;
        } else {
            mTwoPane = false;
        }

        mVictoria = new Victoria[]{
            new Victoria(R.string.bank, R.string.zone_1, WCBankActivity.class, FragmentWCBank.class),
            new Victoria(R.string.wat, R.string.zone_1, WCWATActivity.class, FragmentWCWAT.class)
        };

        //Declare your adapter here so you can access later
        myAdapter = new MyAdapter(getActivity(), mVictoria);

        final ListView listView = (ListView) v.findViewById(R.id.list_victoria);
        //Set teh adapter here.
        listView.setAdapter(myAdapter);
        listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
        listView.setTextFilterEnabled(true);

        return v;
    }

    @Override
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
        // Inflate the menu items for use in the action bar
        inflater.inflate(R.menu.menu_victoria_line, menu);

        // Associate searchable configuration with the SearchView
        SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
        searchView.setIconifiedByDefault(false);

        SearchView.OnQueryTextListener textChangeListener = new SearchView.OnQueryTextListener()
        {
            @Override
            public boolean onQueryTextChange(String newText)
            {
                // this is your adapter that will be filtered
                myAdapter.getFilter().filter(newText);
                System.out.println("on text chnge text: "+newText);
                return true;
            }
            @Override
            public boolean onQueryTextSubmit(String query)
            {
                // this is your adapter that will be filtered
                myAdapter.getFilter().filter(query);
                System.out.println("on query submit: "+query);
                return true;
            }
        };
        searchView.setOnQueryTextListener(textChangeListener);

    }

   /**....rest of your code*/
}