2016-06-11 12 views
0

Ich versuche, eine Suchleiste für eine ListView in einem Fragment für Android zu implementieren. Ich habe es in einer Aktivität arbeiten lassen, aber jetzt muss ich es in einem Fragment arbeiten lassen. Hier ist mein Code:Kontext für ArrayAdapter in Fragment-Klasse

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(); 
} 

}

Das Problem liegt in dem initList() -Methode, wo ich versuche, den Adapter für meine Arraylist zu initialisieren, aber ich bin nicht sicher, wie es zu beheben. Es akzeptiert "das" nicht. Ich habe auch "getContext" ohne Erfolg versucht. Fehlermeldung lautet "kann Konstruktor nicht auflösen". Wenn ich die App mit "getActivity" als Kontext starte, stürzt es nicht ab, aber die Suchleiste ist auch nicht da.

+1

nein, nein, nein, das Filtern in Adaptern erfolgt durch den Aufruf von 'adapter.getFilter(). Filter (constraint)', es gibt Hunderte von Beispielen bei SO und im Web sowie – pskink

+0

Wenn Sie fragen möchten über die fehlende Suchleiste, dann fragen Sie nach, nicht die nicht verwandten Fehler –

Antwort

4

Es akzeptiert "das" nicht.

this ist ein Fragment. Fragment does not inherit from Context.

Ich habe auch "getContext" ohne Erfolg versucht.

Fragment does not have a getContext() method.

Verwenden Sie getActivity(), um eine Instanz des Hosts Activity zu erhalten. Activity erbt von Context.

aber die Suchleiste ist auch nicht da.

Das ist ein separates Problem, etwa bei Ihrem Layout. Es hat nichts mit dem Parameter zu tun, den Sie an den Konstruktor ArrayAdapter übergeben.

0

Sie v.getContext() aus (View v = inflater.inflate(...)) verwenden sollten, und übergeben es an Ihre initList() Methode als initList(Context context) statt getActivity(), die zwei Probleme verursachen können:

1) Sie können nicht sicher sein, dass getActivity() nicht null sein onCreateView(..), wenn Sie also getActivity() dann richten Sie Ihre Array-Adapter in onActivityCreated(..)

2) verwendet werden soll es einen Speicherverlust im Falle verursachen können Sie setRetainInstance (true) in Ihrem Fragment verwenden, da es nicht zu Müll Lage sein wird, sammeln Aktivitätsinstanz zur Orientierungsänderung

Verwandte Themen