繁体   English   中英

在 ListView 中获取位置过滤项

[英]get position filtred item in ListView

如何从过滤列表视图中获取项目位置? 例如,我有列表视图 10 个项目(俱乐部 1.2.3...)。 过滤“4”后,我的列表视图中有 Club 4,int 位置返回 0,但我需要返回 3(从 0 开始计数)

public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    FragmentManager fragmentManager = getFragmentManager();

    // dont't work
    int pos = (Integer) getListAdapter().getItem(position);

    switch (pos){
        case 0:
            fragmentManager.beginTransaction().replace(R.id.content_frame, new Club0Fragment()).commit();
            break;
        case 1:
            fragmentManager.beginTransaction().replace(R.id.content_frame, new Club1Fragment()).commit();
            break;

    }

编辑:

public class NavigationSecondFragment extends ListFragment {


public NavigationSecondFragment() {
    // Required empty public constructor
}
ArrayAdapter adapter;
String[] datasource = {"Club 1","Club 2","Club 3","Club 4","Club 5","Club 6","Club 7","Club 8","Club 9","Club 10","Club 11","Club 12", "Club 13"};


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_navigation_second, container, false);
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    setHasOptionsMenu(true);
    adapter = new ArrayAdapter(getActivity(),android.R.layout.simple_list_item_1,datasource);
    setListAdapter(adapter);
}


@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    menu.clear();
    inflater.inflate(R.menu.menu_search,menu);
    MenuItem searchItem = menu.findItem(R.id.action_search);
    SearchView searchView = (SearchView)MenuItemCompat.getActionView(searchItem);
    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            return false;
        }

        @Override
        public boolean onQueryTextChange(String newText) {
            if (adapter != null) {
                adapter.getFilter().filter(newText);
            }

            return true;
        }
    });

}

我认为您需要创建扩展 ArrayAdapter 的自定义 ArrayAdapter 并实现 Filterable,然后使用您自己的扩展 Filter 的 CustomFilter 覆盖方法 getFilter。

你可以保留你原来的数组,用普通数组过滤,这样你就可以搜索值了,我举个例子。

阵列适配器

public PickerAdapter(Context context, ArrayList<String>) {
    super(context, R.layout.picker_detail_row, alItemsPicker);
    this.alItemsPicker = alItemsPicker; //This array is variable, and modified by CustomFilter
    this.alItemsPickerInicial = alItemsPicker; //This array is final, and its value is set in your constructor
}

覆盖 getFilter

@Override
public Filter getFilter() {
    if (filter == null) {
        filter = new PickerAdapterFilter();
    }
    return filter;
}

并在您的 onListItemClick

public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);

int realposition = alItemsPickerInicial.indexOf(alItemsPicker.get(position))

....your custom code 

自定义过滤器

    private class PickerAdapterFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        FilterResults resultados = new FilterResults();
        if (constraint==null||constraint.length()==0) {
            resultados.count = alItemsPickerInicial.size();
            resultados.values = alItemsPickerInicial;
        } else {
            ArrayList<String> tmpAlItemsPicker = new ArrayList<String>();
                for (String sItemPicker : alItemsPickerInicial) {
                    if (sItemPicker.contains(constraint)) {
                        tmpAlItemsPicker.add(htItemPicker);
                    }
                }
            resultados.count = tmpAlItemsPicker.size();
            resultados.values = tmpAlItemsPicker;
        }
        return resultados;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        alItemsPicker = (ArrayList<String>)results.values;
        if (results.count==0) {
            notifyDataSetInvalidated();
        } else {
            notifyDataSetChanged();
        }
    }

}

我以不同的方式解决了这个问题。 我在位置使用项目,而不是项目的位置。

public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    FragmentManager fragmentManager = getFragmentManager();

    Object item = adapter.getItem(position);

    if(item.equals(datasource[0])) fragmentManager.beginTransaction().replace(R.id.content_frame, new Club1Fragment()).commit();
    if(item.equals(datasource[1])) fragmentManager.beginTransaction().replace(R.id.content_frame, new Club2Fragment()).commit();

    Toast.makeText(getActivity(),item.toString(), Toast.LENGTH_SHORT).show();
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM