1

私はアンドロイドアプリケーションを作成しています。アプリケーションでは私はログインページを持っています。ログイン後、ユーザーリストが表示されます。ユーザーリストのアクティビティはHomeActivity.javaで、UserListFragment.javaChatFragment.javaの2つのフラグメントが含まれています。ユーザーリストはfirebaseから表示されています。フラグメントのアクションバーでの検索ビュー

UserListFragment.javaには、検索メニューとログアウトメニューを持つアクションバーが含まれています。ログアウトメニューは正常に機能しますが、検索が機能しません。検索アイコンが表示されますが、何かを検索するとフィルタは表示されません。私はfirebaseを使ってユーザリストを表示しています。

私は様々な様々な様々なソリューションを試してみましたsearchviewがChatFragment.java

に表示されないようにします。しかし誰も私のために働いていません。

ここにコードがあります。

UserListFragment.java

public class UsersListFragment extends Fragment { 
// TODO: Rename parameter arguments, choose names that match 
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
private static final String ARG_PARAM1 = "param1"; 
private static final String ARG_PARAM2 = "param2"; 
Activity activity; 
// TODO: Rename and change types of parameters 
private String mParam1; 
private String mParam2; 
private static final String TAG = "UsersListFragment"; 
private OnFragmentInteractionListener mListener; 
private ListView listView; 
private List<UserData> users; 
private CustomAdapter adapter; 
SharedPreferences.Editor preferenceEditor; 
Timer myTimer; 
View view; 
ActionBar actionBar; 
private static final String PREFRENCES_NAME = "setPreferences"; 
private ProgressDialog progressBar; 
String partnerKeyValue; 

// TODO: Rename and change types and number of parameters 
public static UsersListFragment newInstance(String param1, String param2) { 
    UsersListFragment fragment = new UsersListFragment(); 
    Bundle args = new Bundle(); 
    args.putString(ARG_PARAM1, param1); 
    args.putString(ARG_PARAM2, param2); 
    fragment.setArguments(args); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Global.getInstance().unreadMessageUsers.clear(); 
    progressBar = new ProgressDialog(getActivity()); 
    progressBar.setCancelable(false); 
    progressBar.setMessage("Loading..."); 
    progressBar.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
    progressBar.setProgress(0); 
    } 

@Override 
public void onCreateOptionsMenu(Menu menu,MenuInflater inflater) { 

    inflater.inflate(R.menu.menu_userlist,menu); 
    MenuItem item = menu.findItem(R.id.menuSearch); 

    SearchView searchView = (SearchView)item.getActionView(); 

    searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String newText) { 
      Log.i(TAG,newText); 
      adapter.getFilter().filter(newText); 
      return true; 
     } 
    }); 

    super.onCreateOptionsMenu(menu,inflater); 
} 


private void logoutUser(){ 
    Intent I = new Intent(getActivity(), LoginActivity.class); 
    startActivity(I); 
} 

@Override 
public boolean onOptionsItemSelected(MenuItem item) { 

    switch (item.getItemId()) { 
     case R.id.menuSearch : 
      return true; 

     case R.id.menuLogout : 
      logoutUser(); 
      return true; 

     default: 
      return super.onOptionsItemSelected(item); 
    } 

} 

menu_userlist.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto"> 

<item android:id="@+id/menuSearch" 
    android:title="@string/search" 
    android:icon="@drawable/ic_search" 
    app:actionViewClass="android.widget.SearchView" 
    app:showAsAction="always"> 
</item> 

<item android:id="@+id/menuLogout" 
    android:title="@string/logout" 
    android:icon="@drawable/ic_logout" 
    app:showAsAction="always"> 
</item> 

CustomAdapter.java

@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint,FilterResults results) { 

      users = (List<UserData>) results.values; // has the filtered values 
      notifyDataSetChanged(); // notifies the data with new filtered values 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new Filter.FilterResults();  

      List<String> FilteredArrList = new ArrayList<String>(); 

       if (mOriginalValues != null) { 

       if (constraint == null || constraint.length() == 0) { 

        // set the Original result to return 
        results.count = mOriginalValues.size(); 
        results.values = mOriginalValues; 
       } else { 
        constraint = constraint.toString().toLowerCase(); 
        for (int i = 0; i < mOriginalValues.size(); i++) { 
         String data = mOriginalValues.get(i).toString(); 
         if (data.toLowerCase().contains(constraint.toString())) { 
          FilteredArrList.add(data); 
         } 
        } 
        // set the Filtered result to return 
        results.count = FilteredArrList.size(); 
        results.values = FilteredArrList; 
       } 
      } 

      return results; 
     } 
    }; 
    return filter; 
} 
} 
+0

はありますか? 'results'リターン変数の値を確認しましたか? – Dibzmania

+0

@Dibzmania my ** results **変数にはこの値が含まれています ** [email protected]** 毎回アルファベットを入力すると値が増えています上記のように検索で入力するアルファベットごとに生成されます。私はそれが何であるか分からない。 – Rider

+0

@Dibzmania私はnull値を得ていると思います。 ** results.values **を印刷しようとしたときに、null例外エラーが発生しました。どうすれば解決できますか? – Rider

答えて

0

私は自分で問題を解決しました。それは他の人を助けるかもしれない。あなたのフィルタ方法は、作業:)

CustomAdapter.java

@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 

     @SuppressWarnings("unchecked") 
     @Override 
     protected void publishResults(CharSequence constraint, 
             FilterResults results) { 
      clear(); 
      addAll((List<UserData>) results.values); 
      arrayList = (List<UserData>)results.values; 
      notifyDataSetChanged(); 
     } 


     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults();  // Holds the results of a filtering operation in values 
      List<UserData> FilteredArrList = new ArrayList<UserData>(); 

      if (mOriginalValues == null) { 
       mOriginalValues = new ArrayList<UserData>(arrayList); 
      } 


      if (constraint == null || constraint.length() == 0) { 
       results.count = mOriginalValues.size(); 
       results.values = mOriginalValues; 
      } else { 
       constraint = constraint.toString().toLowerCase(); 


       for (int i = 0; i < mOriginalValues.size(); i++) { 
        String data = mOriginalValues.get(i).getName(); 

        if (data.toLowerCase().contains(constraint.toString())) { 
         FilteredArrList.add(mOriginalValues.get(i)); 
        } 
       } 
       // set the Filtered result to return 
       results.count = FilteredArrList.size(); 
       results.values = FilteredArrList; 
      } 

      return results; 
     } 

    }; 
    return filter; 
} 
1

変更次のコードセグメント -

@SuppressWarnings("unchecked") 
    @Override 
    protected void publishResults(CharSequence constraint,FilterResults results) { 
     clear(); 
     addAll((List<UserData>) results.values) 
     users = (List<UserData>) results.values; // has the filtered values 

     notifyDataSetChanged(); // notifies the data with new filtered values 
    } 

これはほとんど問題を解決するだろう。あなたのソースコードには多くの矛盾があります。 Filterableインターフェイスを既に実装しているArrayAdpaterを拡張しています。あなたは以下の状態変数を必要とする理由

も見直し -

private List<UserData> messages; 
private List<UserData> users; 
private List<UserData> mOriginalValues; 

あなたがArrayAdapterを拡張していて、コンストラクタで設定された初期データを渡していることに注意してください。その後のデータセットの変更は、親のArrayAdapterでリセットする必要があります。あなたの子クラスの状態変数を変更するだけでは役に立ちません。

+0

編集のために提案したコードは、アプリがクラッシュする原因となります。 '民間一覧メッセージ;' ' 民間一覧ユーザー;' ' 民間一覧 mOriginalValues;' ユーザーとmOrigninalValues私はフィルタ法のために使用してきました。私はアンドロイドに新しいので、いくつかのソースからコードを使用しました。私が未読のメッセージ数に使用しているメッセージは、ユーザーの名前の横に表示する必要があります。 私にいくつかの変更を提供し、私を導くことができたら、私は何を変えるべきですか?それは私にとって本当に役立つでしょう。どうもありがとう。 :) – Rider

+0

クラッシュスタックトレースは何ですか?私は実際にコードを実行していないので、可能性があります。しかし、その考え方は、基になるデータをクリアして新しいデータを追加することです。 – Dibzmania

+0

java.lang.NullPointerException:この行のnullオブジェクト参照で、インタフェースメソッド 'java.lang.Object [] java.util.Collection.toArray()'を呼び出そうとしています。 addAll((リスト)results.values); – Rider

関連する問題