java - fragment 中的 ListView 空指针异常

标签 java android android-fragments android-listview swiperefreshlayout

我正在尝试在我的 fragment 中设置滑动刷新​​,该 fragment 从解析中获取对象。但每次,我似乎都会在 setadapter 和 ListView 上遇到空指针异常。尽管它们都已正确初始化,但它们都不为空。

我最近的适配器:

package com.astuetz.viewpager.extensions.sample;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.HashMap;

public class RecentsAdapter extends BaseAdapter
{

        LayoutInflater inflater;
        Context context;
        ArrayList<HashMap<String,String>> items = null;

        public RecentsAdapter(Context context,ArrayList<HashMap<String,String>> items)
        {
            super();
            this.context = context;
            this.items = items;
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        }

        @Override
        public int getCount()
        {
            return items.size();
        }

        @Override
        public Object getItem(int position)
        {
            return items.get(position);
        }

        @Override
        public long getItemId(int position)
        {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent)
        {
            View v = convertView;
            MyHolder holder = null;
            if(v == null)
            {
                v = inflater.inflate(R.layout.recents_list_item,parent,false);
                holder = new MyHolder(v);
                v.setTag(holder);
            }

            else
            {
                holder = (MyHolder) v.getTag();
            }

            holder.title.setText(items.get(position).get("title"));
            holder.author.setText(items.get(position).get("author"));
            holder.dept.setText(items.get(position).get("dept"));
            holder.price.setText(items.get(position).get("price"));
    //        holder.place.setText(items.get(position).get("place"));


            return v;
        }

        class MyHolder
        {

            TextView dept,title,author,price,place;

            public MyHolder(View view)
            {
                title = (TextView) view.findViewById(R.id.book_title);
                dept = (TextView)view.findViewById(R.id.dept_name);
                author = (TextView) view.findViewById(R.id.author_name);
                price = (TextView)view.findViewById(R.id.price_list);
    //            place = (TextView)view.findViewById(R.id.place_list);
            }

        }
    }

我的recent_card.xml定义了我的 ListView 和滑动刷新:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
             xmlns:card_view="http://schemas.android.com/apk/res-auto"
             android:layout_width="match_parent"
             android:layout_height="match_parent">

    <android.support.v4.widget.SwipeRefreshLayout
        android:id="@+id/container"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

    <android.support.v7.widget.CardView
        android:id="@+id/recents_card"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="8dp"
        card_view:cardBackgroundColor="@android:color/white"
        card_view:cardCornerRadius="8dp"
        android:padding="8dp">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/recents_list"
            android:divider="@color/dividerColor"
            android:dividerHeight="1dp"/>

    </android.support.v7.widget.CardView>
    </android.support.v4.widget.SwipeRefreshLayout>
</FrameLayout>

和我的RecentsCardFragment.java实现它们:

/*
 * Copyright (C) 2013 Andreas Stuetz <<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="02636c66706763712c71767767767842656f636b6e2c616d6f" rel="noreferrer noopener nofollow">[email protected]</a>>
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.astuetz.viewpager.extensions.sample;

import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.view.ViewCompat;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Adapter;
import android.widget.ListView;
import android.widget.Toast;


import com.parse.FindCallback;
import com.parse.GetCallback;
import com.parse.Parse;
import com.parse.ParseException;
import com.parse.ParseObject;
import com.parse.ParseQuery;



import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;



public class RecentsCardFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener
{
   ListView  recentsList = (ListView)getActivity().findViewById(R.id.recents_list);

    private SwipeRefreshLayout refreshBooks;

     ArrayList<HashMap<String,String>> items = new ArrayList<>();





    //private  ProgressDialog progress;


    public static RecentsCardFragment newInstance() {
        RecentsCardFragment f = new RecentsCardFragment();
            return f;
        }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.recents_card,container,false);
        ViewCompat.setElevation(rootView,50);
        refreshBooks = (SwipeRefreshLayout) rootView.findViewById(R.id.container);
        refreshBooks.setOnRefreshListener(this);


        getBooks();


        RecentsAdapter  adapter = new RecentsAdapter(getActivity().getApplicationContext(), items);

        recentsList.setAdapter(adapter);


        return rootView;
    }


    private ArrayList<HashMap<String,String>> getBooks(){

        final ParseQuery<ParseObject> query = ParseQuery.getQuery("Posted");
        query.orderByDescending("createdAt");

        query.findInBackground(new FindCallback<ParseObject>() {


            @Override
            public void done(List<ParseObject> parseObjects, ParseException e) {


                if (e == null){

                    Log.w("Parse","Inside getbooks()");
                    for (ParseObject book : parseObjects) {

                        HashMap<String, String> test = new HashMap<>();

                        String dept = book.getString("Department");
                        String title = book.getString("Title");
                        String author = book.getString("Author");
                        Number price_num = book.getNumber("Price");
                        String price = String.valueOf(price_num);
                        String place = book.getString("Place");
                        String desp = book.getString("Description");

                        test.put("dept", dept);
                        test.put("title", title);
                        test.put("author", author);
                        test.put("price", price);
                        test.put("place", place);
                        test.put("description", desp);

                        items.add(test);




                    }


                } else {

                    Log.d("Books", "Error: " + e.getMessage());

                }

            }

        });

        return items;
    }


    @Override
    public void onRefresh(){

        refreshBooks.setRefreshing(true);
        updateBooks();



}

    private void updateBooks(){

        Toast.makeText(getActivity(),"Refresh", Toast.LENGTH_SHORT).show();

        items.addAll(getBooks());

      refreshBooks.setRefreshing(false);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

   }


    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

    }


 }

这是我的日志:

06-14 02:44:52.485    2373-2373/com.astuetz.viewpager.extensions.sample I/Process﹕ Sending signal. PID: 2373 SIG: 9
06-14 02:58:26.624    2502-2524/com.astuetz.viewpager.extensions.sample D/OpenGLRenderer﹕ Render dirty regions requested: true
06-14 02:58:26.644    2502-2502/com.astuetz.viewpager.extensions.sample D/﹕ HostConnection::get() New Host Connection established 0xabb86710, tid 2502
06-14 02:58:27.720    2502-2502/com.astuetz.viewpager.extensions.sample D/Atlas﹕ Validating map...
06-14 02:58:28.692    2502-2502/com.astuetz.viewpager.extensions.sample I/Choreographer﹕ Skipped 57 frames!  The application may be doing too much work on its main thread.
06-14 02:58:28.716    2502-2502/com.astuetz.viewpager.extensions.sample D/AndroidRuntime﹕ Shutting down VM
06-14 02:58:28.720    2502-2502/com.astuetz.viewpager.extensions.sample E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: com.astuetz.viewpager.extensions.sample, PID: 2502
    java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.support.v4.app.FragmentActivity.findViewById(int)' on a null object reference
            at com.astuetz.viewpager.extensions.sample.RecentsCardFragment.<init>(RecentsCardFragment.java:54)
            at com.astuetz.viewpager.extensions.sample.RecentsCardFragment.newInstance(RecentsCardFragment.java:68)
            at com.astuetz.viewpager.extensions.sample.MainActivity$MyPagerAdapter.getItem(MainActivity.java:133)
            at android.support.v4.app.FragmentPagerAdapter.instantiateItem(FragmentPagerAdapter.java:97)
            at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:837)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:987)
            at android.support.v4.view.ViewPager.populate(ViewPager.java:919)
            at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1441)
            at android.view.View.measure(View.java:17430)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:875)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
            at android.view.View.measure(View.java:17430)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
            at android.view.View.measure(View.java:17430)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
            at android.view.View.measure(View.java:17430)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
            at android.view.View.measure(View.java:17430)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
            at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1436)
            at android.widget.LinearLayout.measureVertical(LinearLayout.java:722)
            at android.widget.LinearLayout.onMeasure(LinearLayout.java:613)
            at android.view.View.measure(View.java:17430)
            at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5463)
            at android.widget.FrameLayout.onMeasure(FrameLayout.java:430)
            at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2560)
            at android.view.View.measure(View.java:17430)
            at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2001)
            at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1166)
            at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1372)
            at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1054)
            at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:5779)
            at android.view.Choreographer$CallbackRecord.run(Choreographer.java:767)
            at android.view.Choreographer.doCallbacks(Choreographer.java:580)
            at android.view.Choreographer.doFrame(Choreographer.java:550)
            at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753)
            at android.os.Handler.handleCallback(Handler.java:739)
            at android.os.Handler.dispatchMessage(Handler.java:95)
            at android.os.Looper.loop(Looper.java:135)
            at android.app.ActivityThread.main(ActivityThread.java:5221)
            at java.lang.reflect.Method.invoke(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:372)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:899)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:694)
06-14 02:58:32.992    2502-2502/com.astuetz.viewpager.extensions.sample I/Process﹕ Sending signal. PID: 2502 SIG: 9

我的 ListView 最近列表或最近列表.ssetadapter(adapter) 行中不断出现空指针异常。

尽管有几个关于同一主题的已回答问题,但无法使用它们解决我的问题。

请帮帮我! 提前致谢!

最佳答案

您的recent_list为 null 并且您在 onCreateView 之外引用它在你的RecentsCardFragment里面,这就是为什么NullPointerException正在发生。移动您的recent_list声明到您的onCreateView方法,像这样:

public class RecentsCardFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener
{
   ListView  recentsList;

    private SwipeRefreshLayout refreshBooks;

     ArrayList<HashMap<String,String>> items = new ArrayList<>();

    //private  ProgressDialog progress;

    public static RecentsCardFragment newInstance() {
        RecentsCardFragment f = new RecentsCardFragment();
            return f;
        }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.recents_card,container,false);
        recentsList = (ListView)rootView.findViewById(R.id.recents_list);
        ViewCompat.setElevation(rootView,50);
        refreshBooks = (SwipeRefreshLayout) rootView.findViewById(R.id.container);
        refreshBooks.setOnRefreshListener(this);


        getBooks();


        RecentsAdapter  adapter = new RecentsAdapter(getActivity().getApplicationContext(), items);

        recentsList.setAdapter(adapter);


        return rootView;
    }

关于java - fragment 中的 ListView 空指针异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30826920/

相关文章:

android - kotlin 中的 requireActivity() 和 requireContext()

java - android volley json解析器错误

java - 如何释放与Apache http客户端属性的连接?

java - 浏览器如何关联每个选项卡中网站的 cookie

java - 为什么我们不能将整数文字作为参数传递给以字节作为形式参数的方法

android - ImageView: onDraw方法绘制 "behind"图片背景,不在顶部

android - 远程数据库帮助类

java - MapActivity 上的 AutoCompleteTextView 不起作用

android - Titanium:缺少 toImage() 转换的清晰度(Android 和 iOS)

android - fragment 已创建但在 listView 的 itemClick 上不可见。卡在这里