2016-04-07 3 views
1

Как я могу получить позицию позиции из списка фильтрованных списков? Например, у меня есть список из 10 элементов (Club 1.2.3 ...). После того, как фильтр "4" У меня есть клуб 4 на моем ListView, внутр положение возврата 0, но мне нужно, чтобы вернуть 3 (отсчет от 0)Получить позицию фильтрацией в ListView

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

} 
+0

Не могли бы вы предоставить более подробную информацию о том, как вы фильтруете список? –

+0

Хорошо, отредактировано ................ – orafix

ответ

0

Я думаю, что вам нужно создать ваш пользовательский ArrayAdapter, который расширяет ArrayAdapter и реализует Filterable, затем переопределяет метод getFilter с вашим собственным CustomFilter, который расширяет Filter.

Вы можете сохранить исходный массив и использовать обычный массив для фильтрации, чтобы вы могли искать значение, я приведу вам пример.

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

@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 

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

} 
+0

Спасибо за ответ, но я стараюсь сделать это намного проще. Фильтр поиска создает новый список на месте моего оригинала, поэтому мне нужно получить ссылку на этот оригинал или сделать копию, и все, я думаю;) – orafix

0

Я решил это по-разному. Я использовал элемент в позиции, а не позиции элемента.

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