2015-07-02 2 views
-3

Моя цель - отфильтровать список с помощью исследования «Whatsapp», когда вы ищете друг с его именем. У меня есть ошибка, когда я пытаюсь писать внутри окна поиска, которое появляется только при нажатии на значок поиска.Android Отфильтровать listview Попытка вызвать метод интерфейса «int java.util.List.size()» на ссылке с нулевым объектом

Это моя ошибка:

Process: org.testing.an_app, PID: 15386 
    java.lang.NullPointerException: Attempt to invoke interface method 'int java.util.List.size()' on a null object reference 
      at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93) 
      at android.widget.AdapterView.checkFocus(AdapterView.java:717) 
      at android.widget.AdapterView$AdapterDataSetObserver.onInvalidated(AdapterView.java:840) 
      at android.widget.AbsListView$AdapterDataSetObserver.onInvalidated(AbsListView.java:6137) 
      at android.database.DataSetObservable.notifyInvalidated(DataSetObservable.java:50) 
      at android.widget.BaseAdapter.notifyDataSetInvalidated(BaseAdapter.java:59) 
      at android.widget.SimpleAdapter$SimpleFilter.publishResults(SimpleAdapter.java:383) 
      at android.widget.Filter$ResultsHandler.handleMessage(Filter.java:282) 
      at android.os.Handler.dispatchMessage(Handler.java:102) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 

И это мой код, чтобы создать ListView с настраиваемыми элементами:

import android.app.ActionBar; 
import android.app.Activity; 
import android.os.Bundle; 
import android.support.v7.app.ActionBarActivity; 
import android.text.TextUtils; 
import android.util.Log; 
import android.view.Menu; 
import android.view.MenuInflater; 
import android.view.MenuItem; 
import android.view.View; 
import android.widget.ListAdapter; 
import android.widget.ListView; 
import android.widget.SearchView; 
import android.widget.SimpleAdapter; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Random; 

public class Friends_List_Screen extends Activity { 


    private SearchView mSearchView; 
    private ListView ListView; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_friends_list); 

     ListView = (ListView) findViewById(R.id.Friends); 

     Create_List(); 

     ListView.setTextFilterEnabled(true); 

    } 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.friend_list_screen_menu, menu); 

     mSearchView = (SearchView) menu.findItem(R.id.search).getActionView(); 

     if (Integer.valueOf(android.os.Build.VERSION.SDK) > 7) { 
      mSearchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
       @Override 
       public boolean onQueryTextSubmit(String s) { 
        return false; 
       } 
       @Override 
       public boolean onQueryTextChange(String s) { 
        ListView = (ListView) findViewById(R.id.Friends); 
        SimpleAdapter adapter = (SimpleAdapter) ListView.getAdapter(); 
        if (TextUtils.isEmpty(s)) { 
         adapter.getFilter().filter(""); 
        } else { 
         adapter.getFilter().filter(s.toString().toLowerCase()); 
        } 
        return true; 
       } 
      }); 
     } 

     final MenuItem searchMI = (MenuItem) menu.findItem(R.id.search); 

     mSearchView.setOnQueryTextFocusChangeListener(new View.OnFocusChangeListener() { 
      @Override 
      public void onFocusChange(View view, boolean queryTextFocused) { 
       if (!queryTextFocused) { 
        searchMI.collapseActionView(); 
       } 
      } 
     }); 
     return true; 
    } 
    private void Create_List(){ 
     ArrayList<Friend_OBJ> Friend_OBJList=new ArrayList<Friend_OBJ>(); 

     Friend_OBJ [] people={ 
       new Friend_OBJ("X","B",R.drawable.profile_icon), 
       new Friend_OBJ("Y", "Q", R.drawable.profile_icon), 
       new Friend_OBJ("Z","D",R.drawable.profile_icon), 
       new Friend_OBJ("W","X",R.drawable.profile_icon)}; 

     Random r=new Random(); 
     for(int i=0;i<100;i++){ 
      Friend_OBJList.add(people[r.nextInt(people.length)]); 
     } 
     ArrayList<HashMap<String, Object>> data=new ArrayList<HashMap<String,Object>>(); 

     for(int i=0;i<Friend_OBJList.size();i++){ 
      Friend_OBJ p=Friend_OBJList.get(i); 

      HashMap<String,Object> Friend_OBJMap=new HashMap<String, Object>(); 

      Friend_OBJMap.put("image", p.getPhotoRes()); 
      Friend_OBJMap.put("name", p.getName()); 
      Friend_OBJMap.put("surname", p.getSurname()); 
      data.add(Friend_OBJMap); 
     } 

     String[] from={"image","name","surname"}; 
     int[] to={R.id.personImage,R.id.personName,R.id.personSurname}; 

     SimpleAdapter adapter=new SimpleAdapter(
       getApplicationContext(), 
       data, 
       R.layout.friends_list_item, 
       from, 
       to); 
     ListView.setAdapter(adapter); 
    } 
} 

ответ

-1

Посмотрите на ошибку:

java.lang.NullPointerException... 
      at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93) 

В частности:

at android.widget.SimpleAdapter.getCount(SimpleAdapter.java:93) 

Ваша ошибка в строке 93 SimpleAdapter.java. Вы должны посмотреть там.

+0

в строке 93 не существует ошибка. Строка 93 - пустая строка и находится внутри метода «Create_List()», если я прокомментирую, что вся часть для поиска кода работает нормально – user4789408

+0

Линия 93 SimpleAdapter? 'Create_List()' находится в строке 93 'Friends_List_Screen'. Код «SimpleAdapter» в вашем вопросе не указан. –

+1

Извините, это была моя ошибка, я скучаю почитать. Ошибка, как вы сказали, внутри SimpleAdapter, которая не моя, но является стандартным адаптером, и я не знаю, как я мог ее исправить. – user4789408

0

Возможно, вы не установили адаптер в свой ListView?

BTW - почему вы называете переменную с тем же именем, что и ее тип класса? (ListView ListView)

+0

Я установил адаптер внутри моего метода Create_List() – user4789408

+0

Да, но в методе onCreateOptionsMenu вы устанавливаете ListView с помощью findViewById, который переопределяет один с адаптером, и, насколько я понимаю, у него нет адаптера, который вы пытаетесь получить позже. – user265732

+0

Не имеет значения, я могу использовать имя, которое я предпочитаю. Если я назову его иначе, все изменится. ListView не переопределяется внутри onCreateOptionsMenu, если я удаляю эту строку, это не решает проблему – user4789408

0

Попробуйте изменить это в Adatper:

public int getCount() { 
if(filteredListData==null){ 
Log.v("LOG","Warning, null filteredListData"); 
return 0; 
}else{ 
return filteredListData.size(); 
} 
} 
Смежные вопросы

 Смежные вопросы