EditText mit gleichzeitiger Search- und Add- Funktion

  • Antworten:10
limo
  • Forum-Beiträge: 4

28.06.2015, 17:33:58 via Website

Hallo Zusammen,

ich habe ein EditText-Feld, dass mit einem Textwatcher eine Liste filtern soll. Weiterhin habe ich einen Button, der wenn gedrückt, einen neuen Eintrag in der Liste anlegt, mit dem String welcher sich zu dieser Zeit im Textfeld befindet:

public class MainActivity extends ActionBarActivity {
ListView listView;
ArrayList<String> player_list = new ArrayList<String>();
ArrayAdapter<String> adapter;
Button addPlayer;
EditText searchPlayer;
String temp_name;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    listView = (ListView) findViewById(R.id.list_view);
    addPlayer = (Button) findViewById(R.id.btn_addPlayer);
    searchPlayer = (EditText) findViewById(R.id.et_searchPlayer);

    player_list.add("bla");
    player_list.add("blubb");

    adapter = new ArrayAdapter<String>(this, R.layout.list_item, player_list);
    listView.setAdapter(adapter);

    addPlayer = (Button) findViewById(R.id.btn_addPlayer);
    addPlayer.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            temp_name = searchPlayer.getText().toString();

            if(temp_name.isEmpty() ) {
                searchPlayer.setText("");
                return;
            }
            if(player_list.contains(temp_name)) {
                searchPlayer.setText("");
                Toast.makeText(getBaseContext(), "Player " + temp_name + 
                          " already exists", Toast.LENGTH_SHORT ).show();
                return;
            }

            player_list.add(temp_name);
            adapter.notifyDataSetChanged();
            adapter.sort(new Comparator<String>() {
                @Override
                public int compare(String lhs, String rhs) {
                    return lhs.toString().compareTo(rhs.toString());
                }
            });
            searchPlayer.setText("");
        }
    });

    searchPlayer.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) {

        }

        @Override
        public void afterTextChanged(Editable s) {
            MainActivity.this.adapter.getFilter().filter(s);
        }
    });
(...)

Nun funktioniert das Ganze ohne den TextChangedListener wunderbar. Mit diesem lassen sich aber keine neuen Listeneinträge mehr anlegen. Weiß jemand woran das liegt und wie ich das beheben kann?

Liebe Grüße,
limo

— geändert am 28.06.2015, 17:36:51

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.06.2015, 17:41:27 via Website

Hallo limo,

Herzlich wilkommen hier im Forum :)

Was ist denn der Fehler? Oder entsteht überhaupt eine Exception oder tut es einfach nur nicht?

Ich könnte mir vorstellen dass der Filter nur bisherige einräge filtert und keine neuen.D.h. neue einträge werden ohne akualisierung des Filters garnicht angezeigt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
limo
  • Forum-Beiträge: 4

28.06.2015, 17:47:18 via Website

Hallo Pascal,

Erstmal Danke! :)

Es entsteht keine Exception. Neue Einträge werden aber nicht anglegt/angezeigt (auch nach erneuter Änderung des Textes nicht).

Wie könnte ich dem Filter denn zu verstehen geben, dass er auch die neu angelegten Einträge anzeigen soll?

Liebe Grüße
limo

— geändert am 28.06.2015, 17:50:09

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.06.2015, 18:00:08 via Website

Versuch erstmal obs geht und deaktiviere vor dem anfügen des neuen Eintrags ds Filter.

Wenn das dannn geht muss du denke ich dach dem hinzufügen das Filter neu setzen, dann sollte es übernommen werden.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
limo
  • Forum-Beiträge: 4

28.06.2015, 18:17:42 via Website

Das klingt vielversprechend. Ich weiss nur leider nicht genau wo/wie ich den filter deaktiviere. Den Teil:

searchPlayer.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) {

    }

    @Override
    public void afterTextChanged(Editable s) {
        MainActivity.this.adapter.getFilter().filter(s);
    }
});

hab ich aus einem Tutorial rauskopiert und weiss ehrlich gesagt nicht genau wie der Filter funktioniert.

LG limo

— geändert am 28.06.2015, 19:15:10

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.06.2015, 19:21:07 via App

Deaktivieren wiss ich gar nicht.

Versuch mal das:

Filter filter = mAdapter.getFilter();
filter = null;

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
limo
  • Forum-Beiträge: 4

28.06.2015, 19:45:34 via Website

Ich weiss leider nicht an welcher Stelle ich das einfügen soll... kannst du das vielleicht in meinen code einbetten und mir dann den schnipsel schicken?

Ich habe allerdings gerade herausgefunden, dass er die Einträge in der ArrayList anlegt. Nur werden sie halt nicht angezeigt. Soviel ich verstanden habe, sollte dieser Befehl:

adapter.notifyDataSetChanged();

dafür zuständig sein. Stimmt das soweit?

LG limo

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

28.06.2015, 21:42:24 via App

Einbetten musst du das vor dem Hinzufügen und das zweite stimmt.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Ju Ku
  • Forum-Beiträge: 72

29.06.2015, 14:25:14 via Website

Du fügst das Element derzeit nur zu der ArrayList hinzu.

player_list.add(temp_name);
        adapter.notifyDataSetChanged();
        adapter.sort(new Comparator<String>() {
            @Override
            public int compare(String lhs, String rhs) {
                return lhs.toString().compareTo(rhs.toString());
            }
        });

Normalerweiße arbeitet Java mit Referenzen, es kann aber sein, dass der ListView Adapter eine Kopie davon erstellt.
Dann solltest du mal im ListView Adapter eine Methode addEntry implementieren, die das Element zur ArrayList im Adapter hinzufügt und dann noftifyDataSetChanged() aufruft.

Antworten
Pascal P.
  • Admin
  • Forum-Beiträge: 11.286

30.06.2015, 16:41:35 via App

@Ju Ku gehen müsste das aber auch so. Habe das schon mehrmals ohne Probleme so aktialisiert. Das list amFilter denn wie gesagt ohne geht es ja.

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Ju Ku
  • Forum-Beiträge: 72

01.07.2015, 16:28:38 via Website

Gib mal temp_name mit Log.v("MainActivity", "temp_name " + temp_name + ".") aus.
Der Filter betrifft ja eig. nur das TextField.

Antworten