ListAdapter- w bibliotece android annotations

0
@EFragment(R.layout.cites_list_layout)
public class CitiesListFragment extends ListFragment {
    @ViewById(R.id.citiesListView)
    ListView citiesListView;
    @Bean
    CitiesNamesAdapter adapter;

    @AfterViews
    void bindAdapter() {
        citiesListView.setAdapter(adapter);
       
    }
Klasa adaptera -
```java
package com.example.lukasz.test;

import android.content.Context;
import android.support.annotation.ColorRes;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lukasz on 23.09.15.
 */
@EBean
public class CitiesNamesAdapter extends BaseAdapter {
    ArrayList<String> citiesNames;
    GetCityName findCity = new GetCityName();

    public CitiesNamesAdapter() {

    }


    @RootContext
    Context context;

    @ColorRes
    int mint;

    @AfterInject
    void initAdapter() {
        citiesNames = findCity.getAll();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        CityItemView cityItemView;

        if (convertView == null) {
            cityItemView = new CityItemView(context);
        } else {
            cityItemView = (CityItemView) convertView;
        }

        if (position % 2 == 0) {
            parent.setBackgroundColor(mint);
        }
        cityItemView.bind(getItem(position));
        return cityItemView;
    }

    @Override
    public int getCount() {
        return citiesNames.size();
    }

    @Override
    public String getItem(int position) {
        return citiesNames.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

I plik z layout-em

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/citiesListView"
        android:layout_gravity="center_horizontal" />
</LinearLayout>

@ItemClick
void cityNameItemClicked(String cityName) {
Toast.makeText(getActivity(), cityName, Toast.LENGTH_SHORT).show();
}
}


O to moj plik z fragmentem, w ktorym ma znajdowac sie ListView, wyskakuje mi set citiesListView jest null, w momencie kiedy chce wywolac metode setAdapter(adapter), nie mam pojecia czemu tak jest. Pomozcie!!!

Z gory dzieki
0

Coś niekompletny ten kod, ale komunikat błędu jest oczywisty - masz null w adapterze dlatego nie działa. Musisz zainicjować czymś ten swój adapter, a właściwie musisz czymś zainicjować swoją listę w adapterze u Ciebie to: ArrayList<String> citiesNames. Przykładowo ja mam taki kod:

public class MoviesAdapter extends ArrayAdapter<Movie>{

    Context mContext;
    ArrayList<Movie> mMovies;

    public MoviesAdapter(Activity context, ArrayList<Movie> movies) {
        super(context, 0, movies);
        mContext = context;
        mMovies = movies;
    }

a w fragmencie mam taki kod:

moviesAdapter = new MoviesAdapter(getActivity(), new ArrayList<Movie>());

gridView = (GridView) rootView.findViewById(R.id.grid_view_movies);
gridView.setAdapter(moviesAdapter);

Zwróć uwagę, że przy tworzeniu obiektu adaptera inicjuję pustą listę, gdybym tego nie zrobił, to też bym uzyskał ten sam błąd co Ty:

new ArrayList<Movie>()

Mam nadzieję, że teraz wszystko jasne? :)

0

Wrzucam pozostala czesc kodu. Tutaj jest moja klasa adaptera

package com.example.lukasz.test;

import android.content.Context;
import android.support.annotation.ColorRes;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EBean;
import org.androidannotations.annotations.RootContext;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by lukasz on 23.09.15.
 */
@EBean
public class CitiesNamesAdapter extends BaseAdapter {
    ArrayList<String> citiesNames;
    GetCityName findCity = new GetCityName();

    public CitiesNamesAdapter() {

    }


    @RootContext
    Context context;

    @ColorRes
    int mint;

    @AfterInject
    void initAdapter() {
        citiesNames = findCity.getAll();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {


        CityItemView cityItemView;

        if (convertView == null) {
            cityItemView = new CityItemView(context);
        } else {
            cityItemView = (CityItemView) convertView;
        }

        if (position % 2 == 0) {
            parent.setBackgroundColor(mint);
        }
        cityItemView.bind(getItem(position));
        return cityItemView;
    }

    @Override
    public int getCount() {
        return citiesNames.size();
    }

    @Override
    public String getItem(int position) {
        return citiesNames.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

a tu jest klasa ktora pozwala mi dodawac elementy do ArrayList, ktora umieszcza w adapterze i pobierac ta ArrayList

package com.example.lukasz.test;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

/**
 * Created by lukasz on 23.09.15.
 */
public class GetCityName implements FindCityInterface {
    public static ArrayList<String> citiesNames = new ArrayList<String>();

    @Override
    public  ArrayList<String> getAll() {
        return citiesNames;
    }

    public static void add(String cityName) {
        citiesNames.add(cityName);
    }
}

0

Acha @panryz napisales o tej adnotacji dla GetCityName. I w momencie kiedy robie to tak

@Bean
GetCityName findCity

Wyskakuje mi taki blad
Error:(27, 5) error: @org.androidannotations.annotations.Bean can only be used on an element annotated with @org.androidannotations.annotations.EBean
czy to jest zwiazane z tym ze klasa GetCityName implementuje interfejs?

1

Z błędu wynika, że jeszcze musisz dodać @EBean nad implementacją klasy interfejsu.

0

A jakies sugestie co do tego Adaptera? Bo tutaj niestety nadal null reference

0

Cały czas masz citiesNames null i stąd ten błąd.

0

Nie wiem czy dobrze to zrobilem i czy dobrze rozumuje ale zmienilem metode bindAdapter w klasie CitiesListFragment na taka

 @AfterViews
    void bindAdapter() {
        if (citiesListView == null) {
            System.out.println("Jestem null");
        } else {
            citiesListView.setAdapter(adapter);
        }

    }

i wypisuje mi Jestem null, co dla mnie oznacza ze listView o nazwie citiesListView jest null. Co oznacza ze blad jest w tej adnotacji @ViewById(R.id.citiesListView)
ListView citiesListView, ktora nie przypisuje mi zadnego listView do citiesListView, ale czemu tego nie robi nie wiem :(

0

A teraz jakies sugestie co do listView?

0
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/mainActivityLayout"
    android:orientation="vertical">
    <fragment
        android:id="@+id/headlines_fragment"
        android:name="com.example.lukasz.test.AddCityFragment_"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <fragment
        android:id="@+id/article_fragment"
        android:name="com.example.lukasz.test.CitiesListFragment_"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1" />
</FrameLayout>

to jeest moj layout do glownej aktywnosci moglby ktos jeszcze rzucic okiem czy nie ma w nim bledow przypadkiem

0

android.view.InflateException: Binary XML file line #12: Binary XML file line #12: Error inflating class fragment bo jeszcze wyskakuje mi taki blad, nie wiem moze to ma zwiazek jakis

0

Gdybyś wrzucił to na githuba to łatwiej byłoby to czytać.

Generalnie sprawa z widokami wygląda tak, że w @EFragment powinien być layout w którym jest listview. Z kolei w @ViewById powinien być ustawiony id samego listview. Z tego co widzę masz to zrobione zatem jest błąd gdzieś wyżej.

Wrzuć cały log błędu, a nie tylko tą jedną linijkę.

0
09-24 13:22:01.106    2268-2268/com.example.lukasz.test I/art﹕ Not late-enabling -Xcheck:jni (already on)
09-24 13:22:01.106    2268-2268/com.example.lukasz.test I/art﹕ Late-enabling JIT
09-24 13:22:01.111    2268-2268/com.example.lukasz.test I/art﹕ JIT created with code_cache_capacity=2MB compile_threshold=1000
09-24 13:22:01.155    2268-2268/com.example.lukasz.test W/System﹕ ClassLoader referenced unknown path: /data/app/com.example.lukasz.test-2/lib/x86
09-24 13:22:01.231    2268-2268/com.example.lukasz.test D/AndroidRuntime﹕ Shutting down VM
    --------- beginning of crash
09-24 13:22:01.232    2268-2268/com.example.lukasz.test E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.example.lukasz.test, PID: 2268
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.lukasz.test/com.example.lukasz.test.MainActivity}: android.view.InflateException: Binary XML file line #12: Binary XML file line #12: Error inflating class fragment
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: android.view.InflateException: Binary XML file line #12: Binary XML file line #12: Error inflating class fragment
            at android.view.LayoutInflater.inflate(LayoutInflater.java:539)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
            at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
            at android.app.Activity.setContentView(Activity.java:2166)
            at com.example.lukasz.test.MainActivity.onCreate(MainActivity.java:25)
            at android.app.Activity.performCreate(Activity.java:6237)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: android.view.InflateException: Binary XML file line #12: Error inflating class fragment
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:782)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
            at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
            at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
            at android.app.Activity.setContentView(Activity.java:2166)
            at com.example.lukasz.test.MainActivity.onCreate(MainActivity.java:25)
            at android.app.Activity.performCreate(Activity.java:6237)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
     Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
            at com.example.lukasz.test.CitiesListFragment.bindAdapter(CitiesListFragment.java:31)
            at com.example.lukasz.test.CitiesListFragment_.onViewChanged(CitiesListFragment_.java:93)
            at org.androidannotations.api.view.OnViewChangedNotifier.notifyViewChanged(OnViewChangedNotifier.java:41)
            at com.example.lukasz.test.CitiesListFragment_.onViewCreated(CitiesListFragment_.java:68)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:926)
            at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
            at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1206)
            at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:2159)
            at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:297)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:748)
            at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
            at android.view.LayoutInflater.rInflate(LayoutInflater.java:835)
            at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:798)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:515)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:423)
            at android.view.LayoutInflater.inflate(LayoutInflater.java:374)
            at com.android.internal.policy.PhoneWindow.setContentView(PhoneWindow.java:393)
            at android.app.Activity.setContentView(Activity.java:2166)
            at com.example.lukasz.test.MainActivity.onCreate(MainActivity.java:25)
            at android.app.Activity.performCreate(Activity.java:6237)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
            at android.app.ActivityThread.-wrap11(ActivityThread.java)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:148)
            at android.app.ActivityThread.main(ActivityThread.java:5417)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
0

Masz ustawione @EActivity w klasie z Activity?

0

Nie mam ja tak zrobiona

public class MainActivity extends FragmentActivity {

    public MainActivity(){

    }

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

        FragmentManager fragManager = getSupportFragmentManager();

        Fragment addFragment = fragManager.findFragmentById(R.id.addCity_fragment);
        Fragment listFragment = fragManager.findFragmentById(R.id.cities_list_fragment);

        if (addFragment == null) {
            addFragment = new AddCityFragment();
        }
        if (listFragment == null) {
            listFragment = new CitiesListFragment();
        }

        if (!addFragment.isAdded()) {
            fragManager.beginTransaction()
                    .add(R.id.addCity_fragment, addFragment)
                    .commit();
        }
        if (!listFragment.isAdded()) {
            fragManager.beginTransaction()
                    .add(R.id.cities_list_fragment, listFragment)
                    .commit();
        }
    }
}

A powinienem miec?

0

W dokumentacji andoridannotations jest napisane:

AndroidAnnotations will generate a fragment subclass with a trailing underscore, e.g. MyFragment_. You should use the generated subclass in your xml layouts and when creating new instance fragments

czyli przy tworzeniu instancji fragmentu CitiesListFragment powienieś używać CitiesListFragment_ innymi słowy:

listFragment = new CitiesListFragment_();
0

Pokaż klasy AddCityFragment i CitiesListFragment.
Tam powinieneś mieć nadpisaną metodę onCreateView.

Poza tym skąd Ci się to bierze?

        Fragment addFragment = fragManager.findFragmentById(R.id.addCity_fragment);
        Fragment listFragment = fragManager.findFragmentById(R.id.cities_list_fragment);
0

addCityFragment

package com.example.lukasz.test;

import android.app.ListFragment;
import android.support.v4.app.Fragment;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ListView;
import android.widget.Toast;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.ItemClick;
import org.androidannotations.annotations.ViewById;

/**
 * Created by lukasz on 23.09.15.
 */

   @EFragment(R.layout.add_city_fragment)
public class AddCityFragment extends Fragment {


    @ViewById
    EditText addCityEditText;
    @ViewById
    ImageButton addSignImageButton;

    @Click(R.id.addSignImageButton)
    public void addCity(){
        String  cityName=addCityEditText.getText().toString();
        GetCityName.add(cityName);
    }
}

i CitiesListFragment

package com.example.lukasz.test;


import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.widget.ListView;
import android.widget.Toast;

import org.androidannotations.annotations.AfterInject;
import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Bean;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.ItemClick;
import org.androidannotations.annotations.ViewById;

/**
 * Created by lukasz on 23.09.15.
 */

@EFragment(R.layout.cites_list_layout)
public class CitiesListFragment extends ListFragment {

    @ViewById(R.id.citiesListView)
    ListView citiesListView;
    @Bean
    CitiesNamesAdapter adapter;

    @AfterViews
    void bindAdapter() {
        citiesListView.setAdapter(adapter);
    }

    @ItemClick
    void cityNameItemClicked(String cityName) {
        Toast.makeText(getActivity(), cityName, Toast.LENGTH_SHORT).show();
    }
}

layout-y tez chcesz do nich?

1

Ja activity napisałbym tak:

public class MainActivity extends FragmentActivity {
 
    public MainActivity(){
 
    }
 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
 
        FragmentTransaction fragManager = getFragmentManager().beginTransaction();
 
        AddCityFragment addFragment = new AddCityFragment_();
        CitiesListFragment listFragment = new CitiesListFragment_();

        fragManager.add(R.id.addCity_fragment, addFragment);
        fragManager.add(R.id.cities_list_fragment, listFragment);
        fragManager.commit();
    }
}
1

Wydaje mi się że problem jest z ItemClick w klasie CitiesListFragment.
spróbuj to na razie zmazać i zobaczeć co się stanie, a potem poczytaj to
https://github.com/excilys/androidannotations/issues/432

0

Tak, tam byl blad ale nie jedyny. Zeby to dzialalo trzeba jeszcze zamiast extends ListFragment zrobic extends Fragment :)
@panryz @Haskell obok Lewandowskiego jestescie Panowie moimi bohaterami ze chcialo wam sie tyle ze mna z tym pierniczyc :)

0
package com.example.lukasz.test;

import android.content.Context;
import android.widget.LinearLayout;
import android.widget.TextView;

import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EViewGroup;
import org.androidannotations.annotations.ViewById;

/**
 * Created by lukasz on 23.09.15.
 */
@EViewGroup(R.layout.city_item)
public class CityItemView extends LinearLayout {
  
    @ViewById
    TextView cityName;

    public CityItemView(Context context) {
        super(context);
    }
    
    public void bind(String name) {
        this.cityName.setText(name);
    }
}

A tutaj tez mi wyskakuje blad z null-em w metodzie bind ale rozumiem ze to jest z tego samego powodu ?

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