使用 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);
我在 onCreateView
的 inflated
布局中创建了 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.
使用 getContext()
而不是 this
。 this
指的是当前对象(Fragment),不是Context的子类。
在 onViewCreated()
中创建适配器,因为 getContext()
returns 在 onCreateView()
.
中为空
您正在 Fragment_alerte_trimise 中使用 Creare_istoricAdapter,因此它需要上下文。因此,我们可以提供 activity 上下文或应用程序上下文(超出 activity 级别)
此外...
getContext() - Returns 上下文视图仅当前 运行 activity.
getActivity()- Return Activity 此片段当前关联。
getActivity() 可以在 Fragment 中用于获取 Fragment 的父 Activity。
将此代码更改添加到您的代码中。
getActivity().getApplicationContext()
我正在尝试从 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);
我在 onCreateView
的 inflated
布局中创建了 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.
使用
getContext()
而不是this
。this
指的是当前对象(Fragment),不是Context的子类。在
onViewCreated()
中创建适配器,因为getContext()
returns 在onCreateView()
. 中为空
您正在 Fragment_alerte_trimise 中使用 Creare_istoricAdapter,因此它需要上下文。因此,我们可以提供 activity 上下文或应用程序上下文(超出 activity 级别)
此外...
getContext() - Returns 上下文视图仅当前 运行 activity.
getActivity()- Return Activity 此片段当前关联。
getActivity() 可以在 Fragment 中用于获取 Fragment 的父 Activity。
将此代码更改添加到您的代码中。
getActivity().getApplicationContext()