Использование ArrayAdapter не будет работать с фрагментом - PullRequest
1 голос
/ 17 февраля 2020

Я пытаюсь получить ArrayList из действия, а затем отобразить его внутри fragment в специальном адаптере. Проблема в том, что я не могу setAdapter сделать это. Ошибка, это говорит о том, что контекст неправильный, когда я создал адаптер.

Класс Creare_istoricAdapter:

public class Creare_istoricAdapter extends ArrayAdapter<Creare_istoric> {
    private static final String TAG = "Creareistoric_adapter";
    private Context mContext;
    int mResource;

    public Creare_istoricAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Creare_istoric> objects) {
        super(context, resource, objects);
        mContext = context;
        mResource = resource;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        String id_alerta = getItem(position).getId_alerta();
        String tip_problema = getItem(position).getTip_problema();
        String data_ora= getItem(position).getData_ora();
        String stare_problema = getItem(position).getStare_problema();
        String descriere = getItem(position).getDescriere();
        Creare_istoric istoric = new Creare_istoric(id_alerta, tip_problema, data_ora, stare_problema, descriere);
        LayoutInflater inflater = LayoutInflater.from(mContext);
        convertView = inflater.inflate(mResource, parent, false);
        TextView text_tip_alerta_istoric = convertView.findViewById(R.id.text_tip_alerta_istoric);
        TextView text_ora_alerta_istoric = convertView.findViewById(R.id.text_ora_alerta_istoric);
        TextView text_stare_alerta_istoric = convertView.findViewById(R.id.text_stare_alerta_istoric);
        text_tip_alerta_istoric.setText(tip_problema);
        text_ora_alerta_istoric.setText(data_ora);
        text_stare_alerta_istoric.setText(stare_problema);
        return convertView;
    }
}

Класс фрагмента:

public class Fragment_alerte_trimise extends Fragment {
    public Fragment_alerte_trimise(){}
    ListView list_view_alerte_trimise;
    ArrayList<Creare_istoric> alerteTrimise= new ArrayList<>();

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View alerte_trimise = inflater.inflate(R.layout.fragment_alerte_trimise,container, false);
        return alerte_trimise;
        Bundle bundle_trimise;
        if (bundle_trimise != null) {
            alerteTrimise = bundle_trimise.getParcelableArrayList("alerte_trimise");
        }
        list_view_alerte_trimise =getView().findViewById(R.id.list_view_alerte_trimise);
        Creare_istoricAdapter adapter = new Creare_istoricAdapter(this, R.layout.istoric_alerte_adapter, alerteTrimise);
        list_view_alerte_trimise.setAdapter(adapter);
    }

}

Проблемы в new Creare_istoricAdapter(this, R.layout.istoric_alerte_adapter, alerteTrimise), касающиеся контекста, а также отображаются серым цветом, говоря это избыточно.

РЕДАКТИРОВАТЬ:

Я изменил код, следуя ответам ниже, но теперь, когда я открываю действие, которое использует фрагмент, он вообще не показывает список. Это только пустой экран.

Фрагмент кода:

public class Fragment_alerte_trimise extends Fragment {
   public Fragment_alerte_trimise(){}
   private ListView list_view_alerte_trimise;
   ArrayList<Creare_istoric> alerteTrimise= new ArrayList<>();

   @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View alerte_trimise = inflater.inflate(R.layout.fragment_alerte_trimise,container, false);
        return alerte_trimise;
}

   @Override
     public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        Bundle bundle_trimise = getArguments();
        if (bundle_trimise != null) {
            alerteTrimise = bundle_trimise.getParcelableArrayList("alerte_trimise");
        }
        list_view_alerte_trimise =getView().findViewById(R.id.list_view_alerte_trimise);
        list_view_alerte_trimise.setAdapter(new Creare_istoricAdapter(getContext(), R.layout.istoric_alerte_adapter, alerteTrimise));
}

} ​​

Как я создал Parceable:

Bundle bundle_trimise = new Bundle();
bundle_trimise.putParcelableArrayList("alerte_trimise", alerteTrimise);
Fragment_alerte_trimise fg = new Fragment_alerte_trimise();
fg.setArguments(bundle_trimise);

У меня ListView, созданный в макете, это inflated с помощью onCreateView, но когда я использую getView().findViewById, он говорит, что это may produce 'NullPointerException', и так же getContext(), который говорит это might be null

Ответы [ 4 ]

2 голосов
/ 17 февраля 2020

Пожалуйста, попробуйте использовать getContext() вместо this.

0 голосов
/ 17 февраля 2020

Вы используете Creare_istoricAdapter в вашем Fragment_alerte_trimise, поэтому он нуждается в контексте. поэтому мы можем задать контекст действия или контекст приложения (за пределами уровня активности)

Более того ...

getContext () - Возвращает представление контекста только текущей запущенной активности.

getActivity () - Возвращает активность, с которой в данный момент связан этот фрагмент.

getActivity () может использоваться во фрагменте для получения родительской активности фрагмента.

Добавьте этот код изменения в ваш код.

getActivity().getApplicationContext() 
0 голосов
/ 17 февраля 2020
  1. Используйте getContext() вместо this. this относится к текущему объекту (фрагменту), который не является подклассом Context.

  2. Создать адаптер в onViewCreated(), поскольку getContext() возвращает ноль в onCreateView().

0 голосов
/ 17 февраля 2020

Вы должны использовать контекст действия вместо контекста фрагмента this. Вместо использования getContext() или getActivity() вы должны инициализировать контекст на onAttach, чтобы избежать NullPointerException. Проверьте ниже:

private Context activityContext;

@Override
public void onAttach(@NonNull Context context) {
    super.onAttach(context);
    activityContext = context;
}

@Override
public void onDetach() {
    super.onDetach();
    activityContext = null;
}

Кроме этого, вы должны return посмотреть внутрь onCreateView в самом конце. Проверьте ниже:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    ....

    // use alerte_trimise instead of getView()
    list_view_alerte_trimise = alerte_trimise.findViewById(R.id.list_view_alerte_trimise);


    //use activityContext instead of this
    Creare_istoricAdapter adapter = new Creare_istoricAdapter(activityContext, R.layout.istoric_alerte_adapter, alerteTrimise);

    ....

    return alerte_trimise;
}

В своем коде вы пытаетесь использовать Bundle после вызова return. Вот почему остальная часть вашего кода недоступна .

...