Przekazywanie zmiennych do onClickListener'a

Odpowiedz Nowy wątek
2015-01-04 21:27
0

Witam,
mam problem z przekazaniem zmiennej List<object> do onClickListenera

W oncreate wpisuje wartości z bazy danych, lista wyświetla i działa (kod poniżej)

protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_add_food_with_list_view);
        //resources lista arrays for adapter
        foodResources = new ArrayList<>();
 
        listView = (ListView)findViewById(R.id.listView);
        searchBox = (EditText)findViewById(R.id.editText);
        searchButton = (Button)findViewById(R.id.button12);
 
        BazaFoodListOfFood db = new BazaFoodListOfFood(AddFoodWithListView.this);
        final Cursor cursor = db.getAll();
        String foodDesc;
        cursor.moveToFirst();
        do{
            foodDesc = cursor.getString(0);
            foodResources.add(new foodResData(
                    foodDesc,
                    cursor.getString(1),
                    cursor.getString(2),
                    cursor.getString(3),
                    cursor.getString(4),
                    cursor.getString(5),
                    cursor.getString(6),
                    cursor.getString(7)
            ));
        }while (cursor.moveToNext()); 

Tutaj jest OnClickListener, który znajduje się w Oncreate:

 
final List<foodResData> data = foodResources;
searchButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(searchBox.getText().toString().length()!=0){
                    List<foodResData> foodResourcesHelper;
                    foodResourcesHelper = data;
                    SearchEngine searchEngine = new SearchEngine();
                    foodResources.clear();
                    superResources.clear();
                    int dlg = foodResourcesHelper.size();
                    for(int i = 0 ; i<dlg; i++){
                        if(searchEngine.find(foodResourcesHelper.get(i).getDescription(),searchBox.getText().toString())) foodResources.add(foodResourcesHelper.get(i));
                    }
 
                    Log.v("checkpoint","LOL");
                    listView.invalidateViews();
                }else Toast.makeText(getApplicationContext(),"Fill search box",Toast.LENGTH_SHORT).show();
            }
        });

Jak sprawdzam debugerem to lista w Listenerze jest pusta pomimo przypisani. W aplikacji gdy klikne przycisk lista się czyści (wykonują się funkcje clear, próbując wywołać element listy w onclick listenerze np: 5 dostaje out of bounds exception)

Z góry dzięki za pomoc :D

P.S. - identyczny problem występuje w OnTextChangeListener :(

a lista przed wejściem do ClickListenera jest pełna? pewno gdzieś pomiędzy onCreate a wywolaniem Clicka ją czyścisz - wojciechmaciejewski 2015-01-04 21:31
niestety ale nic nie znalazłem, może "ślepo" patrzę tutaj cała klasa --> http://codeviewer.org/view/code:49a5 - marek2901 2015-01-04 21:38

Pozostało 580 znaków

2015-01-04 21:58
0

dobra wszystko jasne, zmien w OnClickListnerze z

foodResourcesHelper = data;

na

foodResourcesHelper = foodResources;

albo zadeklaruj jako pole finalne data (tzn widoczne w całej klasie)

po prostu próbujesz się odwołać do zmiennej lokalnej z onCreate której już nie ma jak przejedzie przez tą funkcję

pzdr

niestety wciąż to samo. Wszystko ładnie działało gdy w OnClickListenerze wczytywałem baze danych i wyszukiwałem bezpośrednio z bazy. Ale w OnTextChangeListenerze płynnie działało tylko i wyłącznie na emulatorze (Nexus 4 przycianał) więc chcę to usprawnić i nie wiem w czym jest błąd. :( - marek2901 2015-01-04 22:04
niemożliwe że jest tak jak mówisz. coś nachachmęciłeś - wojciechmaciejewski 2015-01-05 07:58

Pozostało 580 znaków

2015-01-04 23:29
0

Udało się, problem leżał w bardzo prostej rzeczy, sprawdziłem Logami że foodresources wyświetla wartości i ma długość, okazuje się że przepisanie Listy

List<customObj> obj1, obj2;
obj1= new ArrayList<>();
obj2 = new ArrayList<>();
 
obj1.add(new customObj);
 
obj2= obj1;//tak nie zadziała nie wiem w sumie czemu 
 
obj2.get(0);//tu będzie null
 

nie działa w taki sposób

problem błachy, a cały program rozwalony :D

P.S. Optymalizacji w wyszukiwaniu wciąż brak, strasznie przycina nawet na Nexusie 4, który jest dość dobry :(

edytowany 1x, ostatnio: marek2901, 2015-01-04 23:30
będzie zwracał null jezeli obiekt 0 będzie nullem. Tylko i wyłącznie. - wojciechmaciejewski 2015-01-05 07:59

Pozostało 580 znaków

2015-01-05 06:44
0

Postawiłeś błędną diagnozę. Kod, który podałeś działa zgodnie z oczekiwaniami, tu:

obj2.get(0);

nie będzie nulla. Zakładam, że źle przepisałeś kod na forum, a w rzeczywistości jest

obj1.add(new customObj());

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans, 2015-01-05 06:45

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0