使用 ArrayAdapter 不适用于片段

Using a ArrayAdapter won't work with fragment

我正在尝试从 activity 获取 ArrayList,然后将其显示在自定义适配器的 fragment 中。问题是我不能 setAdapter 这样做。当我创建适配器时,它表示上下文错误的错误。

Creare_istoricAdapter class:

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

片段class:

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) 中的问题,关于上下文,并且也是灰色的,说它是多余的。

编辑:

我已经根据下面的答案更改了代码,但是现在当我打开使用该片段的 activity 时,它根本不显示列表。这只是一个空白屏幕。

片段代码:

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

我在 onCreateViewinflated 布局中创建了 ListView,但是当我使用 getView().findViewById 时,它说 may produce 'NullPointerException'getContext() 也是如此 might be null

请尝试使用 getContext() 而不是 this

您必须使用 activity 上下文而不是片段上下文 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;
}

在您的代码中, 您尝试在调用 return 后使用 Bundle。这就是为什么你的代码的其余部分 unreachable.

  1. 使用 getContext() 而不是 thisthis指的是当前对象(Fragment),不是Context的子类。

  2. onViewCreated() 中创建适配器,因为 getContext() returns 在 onCreateView().

  3. 中为空

您正在 Fragment_alerte_trimise 中使用 Creare_istoricAdapter,因此它需要上下文。因此,我们可以提供 activity 上下文或应用程序上下文(超出 activity 级别)

此外...

getContext() - Returns 上下文视图仅当前 运行 activity.

getActivity()- Return Activity 此片段当前关联。

getActivity() 可以在 Fragment 中用于获取 Fragment 的父 Activity。

将此代码更改添加到您的代码中。

getActivity().getApplicationContext()