Je suis actuellement en train d'essayer d'implémenter une Listview qui change dynamiquement lorsque les utilisateurs entrent une requête de recherche ou lorsqu'une option est sélectionnée parmi les options de filtre. J'ai la fonction de recherche qui fonctionne mais les options de filtre ne le sont pas. Par options de filtre, je veux dire si l'utilisateur appuie sur une option de la liste déroulante ci-dessous. Le problème est que si j'appuie sur une option de filtre, la liste obtient un filtre et s'affiche correctement, mais quand j'essaie de faire défiler le bouton de la liste, l'application va planter. J'obtiens un IndexOutOfBoundsExecption mais je ne peux pas comprendre pourquoi. L'erreur complète de logcat estListview lorsque j'atteins le bas de la liste après le filtrage de l'application list crashes
01-16 19:26:11.126 9933-9933/uk.ac.uea.campus_map E/AndroidRuntime: FATAL EXCEPTION: main
Process: uk.ac.uea.campus_map, PID: 9933
java.lang.IndexOutOfBoundsException: Index: 29, Size: 29
at java.util.ArrayList.get(ArrayList.java:411)
at kyle.frameworklibrary.Rev.List.getItem(List.java:37)
at kyle.frameworklibrary.Rev.InfoItemListController.getItem(InfoItemListController.java:25)
at kyle.frameworklibrary.Rev.InfoItemListController.getView(InfoItemListController.java:47)
at android.widget.AbsListView.obtainView(AbsListView.java:2376)
at android.widget.ListView.makeAndAddView(ListView.java:1972)
at android.widget.ListView.fillDown(ListView.java:704)
at android.widget.ListView.fillGap(ListView.java:668)
at android.widget.AbsListView.trackMotionScroll(AbsListView.java:5221)
at android.widget.ListView.trackMotionScroll(ListView.java:1889)
at android.widget.AbsListView$FlingRunnable.run(AbsListView.java:4769)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
at android.view.Choreographer.doCallbacks(Choreographer.java:683)
at android.view.Choreographer.doFrame(Choreographer.java:616)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6209)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755)
01-16 19:26:11.126 9933-9933/uk.ac.uea.campus_map D/AppTracker: App Event: crash
01-16 19:26:11.139 9933-9933/uk.ac.uea.campus_map I/Process: Sending signal. PID: 9933 SIG: 9
Mon code de classe ListView est
package uk.ac.uea.campus_map;
import kyle.frameworklibrary.Rev.InfoItem;
import kyle.frameworklibrary.Rev.InfoView;
import kyle.frameworklibrary.Rev.ListController;
import kyle.frameworklibrary.Rev.ListView;
import android.app.Fragment;
import android.app.SearchManager;
import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.MenuItemCompat;
import android.support.v7.widget.PopupMenu;
import android.support.v7.widget.SearchView;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by Danny on 14/01/2017.
*/
public class BuildingListView extends ListView implements SearchView.OnQueryTextListener{
AppContainerActivity callback;
BuildingListController listController;
SearchView searchView;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
setHasOptionsMenu(true);
return super.onCreateView(inflater, container, savedInstanceState);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
callback.getMenuInflater().inflate(R.menu.building_list_toolbar, menu);
searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.search));
SearchManager searchManager = (SearchManager) callback.getSystemService(Context.SEARCH_SERVICE);
searchView.setSearchableInfo(searchManager.getSearchableInfo(callback.getComponentName()));
searchView.setSubmitButtonEnabled(true);
searchView.setOnQueryTextListener(this);
super.onCreateOptionsMenu(menu, inflater);
}
public static Fragment createFragment(AppContainerActivity ACA){
BuildingListView thisListView = new BuildingListView();
thisListView.setACA(ACA);
return thisListView;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
}
public void setACA(AppContainerActivity ACA){
callback = ACA;
}
@Override
public void onClick(int i) {
InfoView goToFrag = new InfoView();
goToFrag.setInfo((InfoItem)lc.getItem(i));
callback.gotoFragAdd(goToFrag,0,0);
}
@Override
public ListController getListController() {
listController = new BuildingListController(callback.buildingList, this);
return listController;
}
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
lc.getFilter().filter(newText);
lv.setAdapter(listController);
lv.invalidateViews();
return false;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()){
case R.id.filter_academic_dept:
lc.getFilter().filter("type_academic_dept");
lv.invalidateViews();
lv.refreshDrawableState();
return true;
}
return super.onOptionsItemSelected(item);
}
}
et mon code listadapter est
package uk.ac.uea.campus_map;
import android.util.Log;
import android.widget.Filter;
import kyle.frameworklibrary.Rev.InfoItem;
import kyle.frameworklibrary.Rev.InfoItemListController;
import kyle.frameworklibrary.Rev.List;
import kyle.frameworklibrary.Rev.ListView;
/**
* Created by Danny on 16/01/2017.
*/
public class BuildingListController extends InfoItemListController {
protected ItemFilter itemFilter;
public BuildingListController(List<InfoItem> l, ListView li) {
super(l, li);
}
@Override
public Filter getFilter() {
if(itemFilter == null){
itemFilter = new ItemFilter();
}
return itemFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
String filterString = constraint.toString();
FilterResults fitlerResults = new FilterResults();
if(constraint!=null){
List<InfoItem> tempList = new List<InfoItem>();
if(filterString.startsWith("type")){
filterString = filterString.substring(5);
for (int i = 0; i < list.getSize(); i++) {
if (list.getItem(i).getType().toLowerCase().contains(filterString)) {
tempList.add(list.getItem(i));
}
}
} else {
for (int i = 0; i < list.getSize(); i++) {
if (list.getItem(i).getTitle().toLowerCase().contains(filterString)) {
tempList.add(list.getItem(i));
}
}
}
fitlerResults.count = tempList.getSize();
fitlerResults.values = tempList;
}
return fitlerResults;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredList = (List<InfoItem>) results.values;
notifyDataSetChanged();
}
}
}
Toute aide serait appréciée