Java 当ListView适配器为空时,片段无法打开并崩溃
当我的arraylist中没有项目时,CollectionsFragment无法打开并使我的应用程序崩溃 仅当已将对象添加到CollectionsFragment时,才能访问它Java 当ListView适配器为空时,片段无法打开并崩溃,java,android,listview,android-fragments,nullpointerexception,Java,Android,Listview,Android Fragments,Nullpointerexception,当我的arraylist中没有项目时,CollectionsFragment无法打开并使我的应用程序崩溃 仅当已将对象添加到CollectionsFragment时,才能访问它 package fragments; /*Imports*/ public class CollectionsFragment extends Fragment { private static List<Article> mArticleList = new ArrayList<>();
package fragments;
/*Imports*/
public class CollectionsFragment extends Fragment {
private static List<Article> mArticleList = new ArrayList<>();
private ListView lvArticles;
private CollectionAdapter mAdapter;
public CollectionsFragment() {}
public static CollectionsFragment newInstance() {
Bundle args = new Bundle();
CollectionsFragment fragment = new CollectionsFragment();
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
new MyTask().execute();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_collections, container, false);
lvArticles = (ListView) view.findViewById(R.id.lvArticles);
mAdapter = new CollectionAdapter(getContext(), R.layout.row, mArticleList);
lvArticles.setAdapter(mAdapter);
lvArticles.setEmptyView(view.findViewById(R.id.empty));
return view;
}
private class MyTask extends AsyncTask<Article, Article, Void> {
@Override
protected Void doInBackground(Article... articles) {
Article item = (Article) getArguments().getSerializable("Article");
mArticleList.add(item);
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
mAdapter.notifyDataSetChanged();
lvArticles.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Article item = mArticleList.get(position);
Intent intent = new Intent(getContext(), WebViewActivity.class);
intent.putExtra("URL", item.getUrl());
getContext().startActivity(intent);
}
});
lvArticles.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
Article item = mArticleList.get(position);
createDialog(view, item);
return true;
}
});
}
private void createDialog(View view, final Article item) {
final Dialog d = new Dialog(getContext());
d.setContentView(R.layout.dialog_collections);
d.setTitle("Remove article?");
d.setCancelable(true);
Button b = (Button) d.findViewById(R.id.button1);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mArticleList.remove(item);
mAdapter.notifyDataSetChanged();
}
});
d.show();
}
}
}
适配器
包适配器;
/*进口*/
公共类CollectionAdapter扩展了ArrayAdapter{
私人物品清单;
私有int资源;
私人充气机;
公共CollectionAdapter(上下文、int资源、列表对象){
超级(上下文、资源、对象);
物品清单=物品;
这个资源=资源;
充气器=(LayoutFlater)context.getSystemService(context.LAYOUT\u充气器\u服务);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null){
holder=新的ViewHolder();
convertView=充气机。充气(资源,空);
holder.author=(TextView)convertView.findViewById(R.id.a_author);
holder.title=(TextView)convertView.findViewById(R.id.a_title);
holder.desc=(TextView)convertView.findViewById(R.id.a_desc);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
}
holder.author.setText(articleList.get(position.getAuthor());
holder.title.setText(articleList.get(position.getTitle());
holder.desc.setText(articleList.get(position.getDescription());
返回视图;
}
私有类视窗持有者{
私有文本视图作者;
私有文本视图标题;
私有文本视图描述;
}
}
执行以下操作:
onCreateView()
之外声明对象类字段,使其成为视图
对象类字段onPostExecute()
mAdapter = new CollectionAdapter(getContext(), R.layout.row, mArticleList);
lvArticles.setAdapter(mAdapter);
lvArticles.setEmptyView(view.findViewById(R.id.empty));
也可以考虑这样做:
@Override
public int getCount() {
return articleList != null ? articleList.size() : 0;
}
这将阻止加载列表,并且不会出现空指针。在异步任务中:
@Override
protected Void doInBackground(Article... articles) {
Article item = (Article) getArguments().getSerializable("Article");
if(item!=null){
mArticleList.add(item);
}
return null;
}
在您的代码中,ArrayList添加了NULL模型类,这样您就可以在线获得错误
holder.author.setText(articleList.get(position).getAuthor());
还有一个更重要的覆盖方法丢失了
@Override
public int getCount() {
return articleList != null ? articleList.size() : 0;
}
我认为你的任务没有必要。代码中没有阻塞或长时间运行的进程 问题是您在列表中得到的是null对象,我假设这些对象来自getSerializable,因此您使用Author参数启动片段的方式似乎导致了这个问题 除此之外,您还可以使用
mAdapter.add
将对象添加到ListView中,但是您应该使用extensedArrayAdapter{
您应该从onCreateView设置click事件监听器。如果您确实需要AsyncTask,它应该只向适配器添加数据并通知它,而不是为ListView重新分配所有监听器请在此处添加错误日志。但是,stacktrace不会在此处显示错误。列表不是空的。其中的对象是fir第一个预防措施,第二个,请使用@Ravinder Bhandari answer。我认为你应该创建一个完整的答案,以防在将来某个时候另一个被删除。谢谢!它现在起作用了,我不知道它这么简单。
holder.author.setText(articleList.get(position).getAuthor());
@Override
public int getCount() {
return articleList != null ? articleList.size() : 0;
}