扩展Listadapter时出现运行时错误

时间:2018-02-15 08:33:34

标签: java android listadapter

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

  

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

我当前的代码正在尝试显示包含图片和文字的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; } } } ,但我想这无所谓。

FourthFragment.java

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) 错误

mostly code error

我在这里做错了什么?

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

在答案和评论后更新

错误在这里:(很抱歉把它作为引用,否则我不允许我提交TextView tv = (TextView) myFragmentView.findViewById(R.id.bedroom); tv.setText("My Header");

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> 是:

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: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>

更新2:fragment_four.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>

UPDATE3 所以,我创建了一个 fourth_fragment.xml

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

并更改了一行:

onRowInserting

但我仍然收到错误:

  

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

2 个答案:

答案 0 :(得分: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)'on a   null对象引用

问题Id TextView的问题,变量tv可能是null,您在setText上调用了null方法,你不能。

像这样修改你的代码:

TextView tv; //Global Variable

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

尝试:清理您的项目&amp;重建它。

更改您的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;
    }

答案 1 :(得分:0)

最好在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()));