2016-06-11 6 views
0

私は、Android用のフラグメント内のlistViewの検索バーを実装しようとしています。私はそれをアクティビティで動かすことにしましたが、今はフラグメントで動作させる必要があります。ここに私のコードは次のとおりです。FragmentクラスのArrayAdapterのコンテキスト

public class AboFragment extends Fragment { 

String [] items; 
ArrayList<String> listItems; 
ArrayAdapter<String> adapter; 
ListView listView; 
EditText editText; 

public AboFragment() { 
    // Required empty public constructor 
} 
@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 

    View v = inflater.inflate(R.layout.fragment_abo, container, false); 
    listView=(ListView)v.findViewById(R.id.listview); 
    editText=(EditText)v.findViewById(R.id.textsearch); 
    initList(); 
    editText.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 
      if(s.toString().equals("")){ 
       initList(); 
      } 
      else{ 
       searchItem(s.toString()); 
      } 
     } 
     @Override 
     public void afterTextChanged(Editable s) { 

     } 
    }); 

    Button dealerActivity = (Button) v.findViewById(R.id.button_dealer); 
    dealerActivity.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 

      Intent startDealer = new Intent(getActivity(), DealerActivity.class); 
      startActivity(startDealer); 

     } 
    }); 
    return v; 
} 

public void initList(){ 
    items = new String[]{"Canada", "China", "Japan", "USA"}; 
    listItems = new ArrayList<>(Arrays.asList(items)); 
    adapter = new ArrayAdapter<String>(this, R.layout.list_item, R.id.textitem, listItems); 
    listView.setAdapter(adapter); 
} 

public void searchItem(String textToSearch){ 
    for(String item:items){ 
     if(!item.contains(textToSearch)){ 
      listItems.remove(item); 
     } 
    } 
    adapter.notifyDataSetChanged(); 
} 

}

問題は、私は私のArrayList用のアダプタを初期化しようとしているinitList()メソッドであるが、私はそれを修正するかどうかはわかりません。これは「これ」を受け入れません。私も "getContext"を成功させようと試みました。エラーメッセージは "コンストラクタを解決できません"です。 コンテキストとして「getActivity」を使用してアプリケーションを実行すると、クラッシュすることはありませんが、検索バーには表示されません。

+1

いいえ、いいえ、いいえ、 'adapter.getFilter()。filter(constraint)'を呼び出すことでアダプターのフィルターが行われました.SOとウェブには数百もの例があります – pskink

+0

質問したいのですが不足している検索バーについて –

答えて

4

「this」は受け付けていません。

は、Fragmentである。 Fragment does not inherit from Context

「getContext」も成功しませんでした。

Fragment does not have a getContext() method

getActivity()を使用して、ホストActivityのインスタンスを取得します。 ActivityContextから継承します。

でも検索バーはありません。

これは、レイアウトなどの別の問題です。これは、ArrayAdapterコンストラクタに渡すパラメータとは関係ありません。

0

あなたは(View v = inflater.inflate(...))からv.getContext()を使用し、二つの問題が発生することができます代わりにgetActivity()initList(Context context)としてあなたinitList()メソッドに渡す必要があります:あなたはgetActivity()は内のNULLでないことを確認することはできません)

1あなたがgetActivity()を使用したい場合は、それが収集するごみのことができなくなりますので、それはあなたがあなたのフラグメントに)(真setRetainInstanceを使用した場合のメモリリークが発生する可能性がありますonActivityCreated(..)

2)でご使用のアレイアダプタを設定するようonCreateView(..)、オリエンテーション変更のアクティビティインスタンス

関連する問題