Java 当ListView适配器为空时,片段无法打开并崩溃

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

当我的arraylist中没有项目时,CollectionsFragment无法打开并使我的应用程序崩溃

仅当已将对象添加到CollectionsFragment时,才能访问它

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

  • 因为您的异步任务可能尚未完成,并且您正在尝试在适配器内使用mArticleList

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