【问题标题】:Android SearchView not working in fragmentAndroid SearchView 在片段中不起作用
【发布时间】:2015-01-27 12:11:35
【问题描述】:

我正在尝试实现仅在一个片段中需要的搜索视图。它将在列表视图上过滤。

import android.os.Bundle;
import android.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.SimpleAdapter;
import com.alcontrol.atmis.anticimex.R;
import com.alcontrol.atmis.anticimex.model.ListViewsModel;

import java.util.ArrayList;
import java.util.HashMap;

public class SalesParts extends Fragment {

public SalesParts() {
    // Required empty public constructor
}
ArrayList<ListViewsModel> listofOrderSelectedArray = new ArrayList<ListViewsModel>();
ArrayList<ListViewsModel> listofOrdersArray = new ArrayList<ListViewsModel>();
SimpleAdapter adapter;
ArrayAdapter arrayAdapter2;
ListView mListView;
ArrayList<HashMap<String, Object>> items;


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

    listofOrdersArray.add(new ListViewsModel(101, "Order Title 1",""));
    listofOrdersArray.add(new ListViewsModel(102, "Order Title 2",""));
    listofOrdersArray.add(new ListViewsModel(103, "Order Title 3",""));
    listofOrdersArray.add(new ListViewsModel(104, "Order Title 4",""));
    listofOrdersArray.add(new ListViewsModel(105, "Order Title 5",""));
    listofOrdersArray.add(new ListViewsModel(106, "Order Title 6",""));
    listofOrdersArray.add(new ListViewsModel(107, "Order Title 7",""));
    listofOrdersArray.add(new ListViewsModel(108, "Order Title 8",""));
    listofOrdersArray.add(new ListViewsModel(109, "Order Title 9",""));
    listofOrdersArray.add(new ListViewsModel(110, "SOrder Title 10",""));

    mListView = (ListView) getActivity().findViewById(R.id.salespartsList);
    mListView.setTextFilterEnabled(true);

    SearchView mSearchView = (SearchView) getActivity().findViewById(R.id.typeFindSalesPart);
    mSearchView.setIconifiedByDefault(false);
    mSearchView.setOnQueryTextListener(this);
    mSearchView.setSubmitButtonEnabled(false);


    items = new ArrayList<HashMap<String, Object>>();
    HashMap<String, Object> listItem;

    for (int i = 0; i < listofOrdersArray.size(); i++) {
        ListViewsModel selectedDescription = listofOrdersArray.get(i);
        listItem = new HashMap<String, Object>();
        listItem.put("itemTitle",selectedDescription.itemTitle);
        listItem.put("itemID",selectedDescription.itemId);
        listItem.put("addBtn", "");
        items.add(listItem);
    }

    ListView addSelectedItems = (ListView) getActivity().findViewById(R.id.salespartsListSelected);
    arrayAdapter2 = new ArrayAdapter(getActivity(),R.layout.selected_salespart_item,R.id.itemTitle, listofOrderSelectedArray) {

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);

            // get filled view from SimpleAdapter
            View itemView = super.getView(position, convertView, parent);
            // find our button there
            View addButton = itemView.findViewById(R.id.itemDeleteBtn);

            // set a tag to get button position in array (used to get values when button is clicked
            addButton.setTag(String.valueOf(position));

            // add an onClickListener
            addButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String tagName = (String) v.getTag();
                    int arrayPosition = Integer.valueOf(tagName);

                    //remove selected item from the list of sales parts to choose from
                    listofOrderSelectedArray.remove(arrayPosition);
                    arrayAdapter2.notifyDataSetChanged();
                }
            });

            return itemView;
        }
    };
    addSelectedItems.setAdapter(arrayAdapter2);

    adapter = new SimpleAdapter(getActivity(), items, R.layout.salespart_item, new String[]{"itemTitle", "addBtn"}, new int[]{R.id.itemTitle, R.id.itemAddBtn}) {

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = super.getView(position, convertView, parent);

            // get filled view from SimpleAdapter
            View itemView = super.getView(position, convertView, parent);
            // find our button there
            View addButton = itemView.findViewById(R.id.itemAddBtn);

            // set a tag to get button position in array (used to get values when button is clicked
            addButton.setTag(String.valueOf(position));

            // add an onClickListener
            addButton.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    String tagName = (String) v.getTag();
                    int arrayPosition = Integer.valueOf(tagName);
                    String title =listofOrdersArray.get(arrayPosition).itemTitle;
                    int id =listofOrdersArray.get(arrayPosition).itemId;

                    // add selected item to list of selected sales parts
                    listofOrderSelectedArray.add(new ListViewsModel(id, title, ""));
                    arrayAdapter2.notifyDataSetChanged();
                }
            });

            return itemView;
        }
    };
    mListView.setAdapter(adapter);

}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) { 
    // Inflate the layout for this fragment
    return inflater.inflate(R.layout.fragment_sales_parts, container, false);
}
}

我已将上述代码放在“OnActivityCreated”中,但在 setOnQueryTextListener(this) 行出现错误。我尝试将“this”更改为 getActivity() 和 getView(),但都没有解决问题。

【问题讨论】:

  • 发布您的fragment 代码...
  • 已添加片段 - 谢谢
  • 但是为什么你在onActivityCreated(..) 中添加代码将所有代码从onActivityCreated 移动到onCreateView(....)

标签: android android-fragments android-listview searchview android-search


【解决方案1】:

改onCreateView(...)点赞

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                     Bundle savedInstanceState) { 
 // Inflate the layout for this fragment
 View view=inflater.inflate(R.layout.fragment_sales_parts, container, false);

   mListView = (ListView)view.findViewById(R.id.salespartsList);

  SearchView mSearchView = (SearchView)view.findViewById(R.id.typeFindSalesPart);

   ...........
 return view;
 }

并从onActivityCreated(....) 中删除所有代码并移至onCreateView(....)

【讨论】:

  • 谢谢,但这仍然会在这一行抛出错误 mSearchView.setOnQueryTextListener(this);说它不能应用于 android.View.view
  • @user2029541 应用内部类/Go to或refer this post等接口
  • @user2029541 你应该implements SearchView.OnQueryTextListener 到你的Fragment
  • 啊,这就是我认为我必须做的,我认为片段是为了让开发更容易:/。谢谢 M D。我会试一试的。
【解决方案2】:

为什么不使用下面的 searchView 以及链接 Android SearchView Filter ListView 中的列表视图过滤器

searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String arg0) {
         // filter listview
            return true;
        }

        @Override
        public boolean onQueryTextChange(String arg0) {

            return false;
        }
    });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 2023-03-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-10
    相关资源
    最近更新 更多