简体   繁体   English

在 ListView 中获取位置过滤项

[英]get position filtred item in ListView

How can i get a item position from filtred listview ?如何从过滤列表视图中获取项目位置? For example i have list view 10 items (Club 1.2.3...).例如,我有列表视图 10 个项目(俱乐部 1.2.3...)。 After filter "4" i have Club 4 on my listview, int position return 0 but i need to return 3 (count from 0)过滤“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;

    }

EDIT:编辑:

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

}

I think that you need create your custom ArrayAdapter that extends of ArrayAdapter and implements Filterable then override the method getFilter with your own CustomFilter that extends of Filter.我认为您需要创建扩展 ArrayAdapter 的自定义 ArrayAdapter 并实现 Filterable,然后使用您自己的扩展 Filter 的 CustomFilter 覆盖方法 getFilter。

You can preserve your original array, and use the normal array for filtering, so you can search for the value, I give you an example.你可以保留你原来的数组,用普通数组过滤,这样你就可以搜索值了,我举个例子。

ArrayAdapter阵列适配器

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
}

Override getFilter覆盖 getFilter

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

And in your onListItemClick并在您的 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 

CustomFilter自定义过滤器

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

}

I solved that in diffrent way.我以不同的方式解决了这个问题。 I used item at position, not position of item.我在位置使用项目,而不是项目的位置。

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