2016-11-30 7 views
0

my appのアクティビティでarrayadapterで表現された別の言語の単語とその翻訳をしたいと思います。私はそれを翻訳と単語自体の両方で別々に列挙することはできません。理想的な状況では、アダプタ内の各リストは、このArrayAdapterは、文字列の出現に基づいて、最初の部分ではなく単語のどこにでもあることを提案します

単語1(トランス-1)のような形

WORD2(TRANS2)

など(など)

に表示させることです

であり、ユーザがアレイアダプタを使用して検索バーに入力したものが何であれ、アレイアダプタは、翻訳またはタイトルによって正しい単語を提示する。基本的には、入力が文字列内に存在する場合は、それを提案する必要があります。

arrayadapterの値を並べ替えるカスタム方法と、リストされたものを決める方法を知らないのですが、文字列内のどこでも入力を探す必要があります。現在のように始まります。

何か助けていただければ幸いです。

編集:まだアイデアはありません。ドキュメントを見て、有用な方法を見つけることができませんでした。

答えて

0

これは、選択したロケールのRES-文字列を取得する方法です:事前に

Locale locale = new Locale("fr"); 
Configuration config = new Configuration(); 
config.locale = locale; 
getResources().updateConfiguration(config, null); 
getResources().getString(R.string.your_string); 

あなたはそれを変更する前に、地元の右のインスタンス安全べき、あなたは元の状態にリセットすることができるように。

クラス内でStringを使用している場合は、intに変更してリソース識別子を参照する必要があります。

リストの項目の場合、後で簡単にフィルタリングするためにロケールのバージョンを保存することができます。

フィルタリングが完了しました。

あなたは、データの2つのリストが含まれている必要があり、この

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 

     @Override 
     public boolean onQueryTextSubmit(String query) { 
      AndroidUtils.hideKeyboard(getActivity()); 
      return true; 
     } 

     @Override 
     public boolean onQueryTextChange(final String newText) { 
      adapter.getFilter().filter(newText); 
      adapter.notifyDataSetChanged(); 
      return true; 
     } 

    }); 

アダプタのようなものを自分のレイアウトにSearchViewを追加し、書き込み

adapter.setFilter(filterString) 

経由でアダプタにフィルタを追加する必要がありますし、濾過し、ソースを。アダプターのコンストラクターにコンテキストをプッシュし、リソースから文字列を取得します。

アダプターはFilterableを実装する必要があります。次に、メソッドgetFilter()をオーバーライドします。機能で

@Override 
public Filter getFilter() { 
    return new Filter(){ 
     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      constraint = constraint.length()>0? constraint.toString().toLowerCase():""; 
      FilterResults result = new FilterResults(); 
      if (constraint.toString().length() > 0) { 
       ArrayList<Integer> filterList = new ArrayList<>(); 
       for(Integer current: sourceListInAdapter){ 
        if(getString(textForFilter).toLowerCase().contains(constraint)){ 
         filterList.add(current); 
        } 
       } 
       result.values = filterList; 
       result.count = filterList.size(); 
      }else { 
       result.values = sourceListInAdapter; 
       result.count = sourceListInAdapter.size(); 
      } 
      return result; 
     } 
     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      temporaryData = (ArrayList<Integer>) results.values; 
      //TEMPORARY data is data which is used in appearance. 
      notifyDataSetChanged(); 
     } 
    }; 

}

Filter#performFiltering検索の独自のロジックを生成します。それはこのようなものになります。私はそれをフィルタリングする方法を示しています。この場合、結果は現在のロケール結果を持つ現在の(デバイス)ロケールによって除外されます。

さらにもう1つ。ロケール検出について。これはあなたのために役立つことができます:

public String localeToString(Locale l) { 
    return l.getLanguage() + "," + l.getCountry(); 
} 

public Locale stringToLocale(String s) { 
    StringTokenizer tempStringTokenizer = new StringTokenizer(s,","); 
    if(tempStringTokenizer.hasMoreTokens()) 
    String l = tempStringTokenizer.nextElement(); 
    if(tempStringTokenizer.hasMoreTokens()) 
    String c = tempStringTokenizer.nextElement(); 
    return new Locale(l,c); 
} 

希望、それは

を支援します
関連する問題