【问题标题】:Runtime error while expanding a Listadapter扩展 Listadapter 时出现运行时错误
【发布时间】:2018-02-15 08:33:33
【问题描述】:

我正在编写此代码以在 android 中拥有一个自定义列表。我正在使用

'com.android.support:support-v4:26.1.0'

我当前的代码试图显示一个包含图像和文本的listview,但我想这并不重要。

FourthFragment.java

public class FourthFragment extends ListFragment {

    private ArrayList<Weather>  weatherProperties = new ArrayList<>();

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View myFragmentView = inflater.inflate(R.layout.fragment_fourth, container, false);
        //create our property elements
        weatherProperties.add(new Weather(10, "Smith Street", "Sydney", "NSW", "A large 3 bedroom apartment right in the heart of Sydney! A rare find, with 3 bedrooms and a secured car park.", 450.00, "property_image_1", 3, 1, 1));
        weatherProperties.add(new Weather(66, "King Street", "Sydney", "NSW", "A fully furnished studio apartment overlooking the harbour. Minutes from the CBD and next to transport, this is a perfect set-up for city living.", 320.00, "property_image_2", 1, 1, 1));
        weatherProperties.add(new Weather(1, "Liverpool Road", "Liverpool", "NSW", "A standard 3 bedroom house in the suburbs. With room for several cars and right next to shops this is perfect for new families.", 360.00, "property_image_3", 3, 2, 2));
        weatherProperties.add(new Weather(567, "Sunny Street", "Gold Coast", "QLD", "Come and see this amazing studio apartment in the heart of the gold coast, featuring stunning waterfront views.", 360.00, "property_image_4" , 1, 1, 1));

        TextView tv = (TextView) myFragmentView.findViewById(R.id.bedroom);
        tv.setText("My Header");
//        setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,names));
        // New Array Adapters
        ArrayAdapter<Weather> adapter = new weatherArrayAdapter(getContext(), 0, weatherProperties);
        //Find list view and bind it with the custom adapter
        ListView listView = (ListView) tv.findViewById(R.id.customListView);
        listView.setAdapter(adapter);


        return myFragmentView;
    }
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        // on click display the item in toast
        Toast.makeText(getActivity(), (String)l.getItemAtPosition(position), Toast.LENGTH_SHORT).show();
    }
    static FourthFragment newInstance(int num) {
        FourthFragment fourthFragment = new FourthFragment();

        Bundle args = new Bundle();
        args.putInt("num", num);
        fourthFragment.setArguments(args);

        return fourthFragment;
    }


    //custom ArrayAdapater
    class weatherArrayAdapter extends ArrayAdapter<Weather>{

        private Context context;
        private List<Weather> weatherProperties;

        //constructor, call on creation
        public weatherArrayAdapter(Context context, int resource, ArrayList<Weather> objects) {
            super(context, resource, objects);

            this.context = context;
            this.weatherProperties = objects;
        }

        //called when rendering the list
        public View getView(int position, View convertView, ViewGroup parent) {

            //get the weather we are displaying
            Weather weather = weatherProperties.get(position);

            //get the inflater and inflate the XML layout for each item
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

            //conditionally inflate either standard or special template
            View view;

            view = inflater.inflate(R.layout.weather_layout, null);


            TextView description = (TextView) view.findViewById(R.id.description);
            TextView address = (TextView) view.findViewById(R.id.address);
            TextView bedroom = (TextView) view.findViewById(R.id.bedroom);
            TextView bathroom = (TextView) view.findViewById(R.id.bathroom);
            TextView carspot = (TextView) view.findViewById(R.id.carspot);
            TextView price = (TextView) view.findViewById(R.id.price);
            ImageView image = (ImageView) view.findViewById(R.id.image);

            //set address and description
            String completeAddress = weather.getStreetNumber() + " " + weather.getStreetName() + ", " + weather.getSuburb() + ", " + weather.getState();
            address.setText(completeAddress);

            //display trimmed excerpt for description
            int descriptionLength = weather.getDescription().length();
            if(descriptionLength >= 100){
                String descriptionTrim = weather.getDescription().substring(0, 100) + "...";
                description.setText(descriptionTrim);
            }else{
                description.setText(weather.getDescription());
            }

            //set price and weather attributes
            price.setText("$" + String.valueOf(weather.getPrice()));
            bedroom.setText("Bed: " + String.valueOf(weather.getBedrooms()));
            bathroom.setText("Bath: " + String.valueOf(weather.getBathrooms()));
            carspot.setText("Car: " + String.valueOf(weather.getCarspots()));

            //get the image associated with this weather
            int imageID = context.getResources().getIdentifier(weather.getImage(), "drawable", context.getPackageName());
            image.setImageResource(imageID);

            return view;
        }
    }


}

没有compiletime 错误,但这给了我runtime 错误

 java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference

   at com.example.phocast.FourthFragment.onCreateView(FourthFragment.java:39)
   at android.support.v4.app.Fragment.performCreateView(Fragment.java:2354)

我在这里做错了什么?

如果你能把问题告诉我,我将不胜感激。

答案和 cmets 后更新

错误在这里:(很抱歉将其作为引用,否则不允许我以mostly code error 提交)

TextView tv = (TextView) myFragmentView.findViewById(R.id.bedroom);
tv.setText("My Header");

xml 是:

weather_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingTop="10dp"
    android:paddingBottom="10dp">

    <ImageView
        android:id="@+id/image"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_marginRight="10dp"
        android:contentDescription="Property Image" />

    <LinearLayout
        android:id="@+id/infoSection"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/image"
        android:orientation="vertical">

        <TextView
            android:id="@+id/address"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="Street Address"
            android:textSize="18sp" />

        <TextView
            android:id="@+id/description"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="Description"
            android:textSize="15sp" />
    </LinearLayout>

    <RelativeLayout
        android:id="@+id/pricingSection"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/infoSection"
        android:orientation="vertical">

        <TextView
            android:id="@+id/price"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="Price" />

        <TextView
            android:id="@+id/bedroom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/price"
            android:layout_marginRight="15dp"
            android:text="Bed:" />

        <TextView
            android:id="@+id/bathroom"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/price"
            android:layout_marginRight="15dp"
            android:layout_toRightOf="@id/bedroom"
            android:text="Bath:" />

        <TextView
            android:id="@+id/carspot"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/price"
            android:layout_marginRight="15dp"
            android:layout_toRightOf="@id/bathroom"
            android:text="Car:" />

    </RelativeLayout>

</RelativeLayout>

更新 2:fragment_four.xml

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/colorPrimaryLight">

    <ListView
    android:id="@+id/customListView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_alignParentStart="true"
    android:scrollbars="vertical"
    android:textAlignment="gravity">
    </ListView>
    </RelativeLayout>

更新3 所以,我创建了一个 fourth_fragment.xml 为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/colorPrimaryLight">

    <TextView
            android:id="@+id/textView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginBottom="10dp"
            android:text="Description"
            android:textSize="15sp" />
    <ListView
        android:id="@+id/customListView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentStart="true"
        android:layout_centerHorizontal="true"
        android:scrollbars="vertical"
        android:textAlignment="gravity"></ListView>
</LinearLayout>

并改行:

tv = (TextView) myFragmentView.findViewById(R.id.textView);
          tv.setText("My Header");

但我仍然收到错误:

java.lang.NullPointerException: 尝试调用虚方法 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' 空对象引用

【问题讨论】:

  • FourthFragment 课程的第 39 行是什么?
  • 您在哪一行出现错误,请发布该行代码@BaRud
  • 发布 R.layout.weather_layout xml 并检查 textview id。什么是 tv.findViewById(R.id.customListView);
  • 请检查您的布局R.layout.fragment_fourth是否有指定的id即R.id.bedroom
  • 你能发布你的'fragment_fourth.xml'吗

标签: java android listadapter


【解决方案1】:

你在这里收到null。检查布局中是否有TextView id = bedroom fragment_fourth

  TextView tv = (TextView) myFragmentView.findViewById(R.id.bedroom);
  tv.setText("My Header");

您的错误

'void android.widget.TextView.setText(java.lang.CharSequence)' 空对象引用

你的TextViewId的问题,变量tv可能是null,你在那个null上调用setText方法,你不能。

并且像这样修改你的代码:

TextView tv; //Global Variable

      tv = (TextView) myFragmentView.findViewById(R.id.bedroom);
      tv.setText("My Header");

也可以试试:清理您的项目并重建它。

更改您的 fragmentfour.xml 代码:(如果需要,请输入 ScrollView

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:background="@color/colorPrimaryLight">

<include
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   layout="@layout/yourTextView_layout)" />

    <ListView
    android:id="@+id/customListView"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_centerHorizontal="true"
    android:layout_alignParentStart="true"
    android:scrollbars="vertical"
    android:textAlignment="gravity">
    </ListView>
    </LinearLayout>

更新你的 Fragment java 类:

ListView listView;//globally
TextView tv;


     @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View myFragmentView = inflater.inflate(R.layout.fragment_fourth, container, false);

  listView = (ListView) tv.findViewById(R.id.customListView);
        //create our property elements
        weatherProperties.add(new Weather(10, "Smith Street", "Sydney", "NSW", "A large 3 bedroom apartment right in the heart of Sydney! A rare find, with 3 bedrooms and a secured car park.", 450.00, "property_image_1", 3, 1, 1));
        weatherProperties.add(new Weather(66, "King Street", "Sydney", "NSW", "A fully furnished studio apartment overlooking the harbour. Minutes from the CBD and next to transport, this is a perfect set-up for city living.", 320.00, "property_image_2", 1, 1, 1));
        weatherProperties.add(new Weather(1, "Liverpool Road", "Liverpool", "NSW", "A standard 3 bedroom house in the suburbs. With room for several cars and right next to shops this is perfect for new families.", 360.00, "property_image_3", 3, 2, 2));
        weatherProperties.add(new Weather(567, "Sunny Street", "Gold Coast", "QLD", "Come and see this amazing studio apartment in the heart of the gold coast, featuring stunning waterfront views.", 360.00, "property_image_4" , 1, 1, 1));

         tv = (TextView) myFragmentView.findViewById(R.id.bedroom);
        tv.setText("My Header");
//        setListAdapter(new ArrayAdapter<String>(getActivity(),android.R.layout.simple_list_item_1,names));
        // New Array Adapters
        ArrayAdapter<Weather> adapter = new weatherArrayAdapter(getContext(), 0, weatherProperties);
        //Find list view and bind it with the custom adapter

        listView.setAdapter(adapter);


        return myFragmentView;
    }

【讨论】:

  • 这不会改变任何东西。我仍然在同一行上遇到同样的错误。
  • 你能发布你的fragment_fourth.xml
  • 您的fourth_fragment.xml中没有带有id卧室的textview,您的卧室id textview在weather_layout.xml @BaRud
  • 实际上,您正在将布局 fragment_four 附加到 FragmentFour.java ,您需要在您的four_fragment.xml 中创建一个文本视图
  • 但我想显示weather_fragment。那么,我可以附加现有的列表视图,而不是创建文本视图吗?
【解决方案2】:

最好在 POJO 模型类中设置所有不为 null 的值。应用它会避免崩溃

if(weather.getPrice() != null && !weather.getPrice().isEmpty()) 
price.setText("$" + String.valueOf(weather.getPrice()));
if(weather.getBedrooms() != null && !weather.getBedrooms().isEmpty()) 
bedroom.setText("Bed: " + String.valueOf(weather.getBedrooms()));
if(weather.getBathrooms() != null && !weather.getBathrooms().isEmpty()) 
bathroom.setText("Bath: " + String.valueOf(weather.getBathrooms()));
if(weather.getCarspots() != null && !weather.getCarspots().isEmpty()) 
carspot.setText("Car: " + String.valueOf(weather.getCarspots()));

【讨论】:

    猜你喜欢
    • 2018-02-25
    • 1970-01-01
    • 1970-01-01
    • 2018-07-23
    • 2023-03-21
    • 1970-01-01
    • 2018-01-19
    • 2017-10-08
    • 2020-09-27
    相关资源
    最近更新 更多