Я хочу отобразить некоторые объекты, которые я заполнил данными из файла JSON в ListView. В моем коде я создаю Listview, а затем создаю пользовательский адаптер списка, но он вылетает, как только мое приложение открывает просмотр списка. Вот код из действия InsectsCatchable:
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.widget.ListView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
public class InsectsCatchable extends AppCompatActivity {
private static final String TAG = "InsectsCatchable";
@Override
protected void onCreate(Bundle savedInstanceState) {
String insects_total = "";
JSONArray insects_array = null;
super.onCreate(savedInstanceState);
Log.d(TAG,"onCreate: Started.");
setContentView(R.layout.activity_insects_catchable);
ListView mListView = (ListView) findViewById(R.id.listInsects);
InputStream insects_stream = getResources().openRawResource(R.raw.insects);
BufferedReader reader = new BufferedReader(new InputStreamReader(insects_stream));
try {
//load JSON
String insects_string = reader.readLine();
while (insects_string != null) {
insects_total = insects_total+insects_string;
insects_string = reader.readLine();
}
insects_array = new JSONArray(insects_total);
// create insectsArray
ArrayList<Insect> insectsList = new ArrayList<>();
for (int i = 0; i< insects_array.length();i++){
//iterate over JSON object
JSONObject currentins = insects_array.getJSONObject(i);
//every insect gets instanciated and put into the insectslist
Insect e = new Insect(currentins);
insectsList.add(e);
}
//create Listadapter
InsectListAdapter adapter = new InsectListAdapter (this, R.layout.adapter_view_layout, insectsList);
mListView.setAdapter(adapter);
} catch (Exception e) {
e.printStackTrace();
}
}
}
А это мой пользовательский адаптер InsectListAdapter. java
import android.content.Context;
import android.text.Layout;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import java.util.ArrayList;
import java.util.List;
public class InsectListAdapter extends ArrayAdapter<Insect> {
private static final String TAG = "InsectListAdapter";
private Context mContext;
int mResource;
public InsectListAdapter(@NonNull Context context, int resource, @NonNull ArrayList<Insect> objects) {
super(context, resource, objects);
this.mContext = mContext;
Log.d(TAG,"InsectListAdapter started");
mResource = resource;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
//Insect insect = new Insect();
//LayoutInflater inflater = LayoutInflater.from(mContext);
//convertView = inflater.inflate(mResource,parent,false);
/*TextView tvPrice = (TextView) convertView.findViewById(R.id.priceview);
TextView tvLocation = (TextView) convertView.findViewById(R.id.locationview);
TextView tvName = (TextView) convertView.findViewById(R.id.nameview);*/
return convertView;
}
}
А это файлы. xml для InsectsCatchable:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/nook"
tools:context=".InsectsCatchable">
<ListView
android:id="@+id/listInsects"
android:layout_marginTop="100dp"
android:layout_width="409dp"
android:layout_height="550dp"/>
</LinearLayout>
и "adapter_view_layout"
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:weightSum="100">
<TextView
android:gravity="center"
android:textAlignment="center"
android:text="Name"
android:layout_width="match_parent"
android:layout_height="60dp"
android:id="@+id/nameview"
android:layout_weight="66.6"/>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_weight="33.3">
<TextView
android:gravity="center"
android:text="Price"
android:layout_width="match_parent"
android:layout_height="30dp"
android:id="@+id/locationview"/>
<TextView
android:gravity="center"
android:text="Location"
android:layout_width="match_parent"
android:layout_height="30dp"
android:id="@+id/textView3"
android:layout_below="@+id/priceview"/>
</LinearLayout>
</LinearLayout>
У кого-нибудь есть идея, почему я не могу показать цены и имена насекомых (для подтверждения концепции) в моем Listview в InsectsCatchable?
РЕДАКТИРОВАТЬ: Logcat:
2020-03-28 15:41:46.586 16312-16312/com.example.acfaunapedia D/InsectListAdapter: InsectListAdapter started
2020-03-28 15:41:46.613 16312-16312/com.example.acfaunapedia I/Choreographer: Skipped 68 frames! The application may be doing too much work on its main thread.
2020-03-28 15:41:46.684 16312-16312/com.example.acfaunapedia D/AndroidRuntime: Shutting down VM
--------- beginning of crash
2020-03-28 15:41:46.685 16312-16312/com.example.acfaunapedia E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.acfaunapedia, PID: 16312
java.lang.NullPointerException: Attempt to invoke virtual method 'int android.view.View.getImportantForAccessibility()' on a null object reference
at android.widget.AbsListView.obtainView(AbsListView.java:2379)
at android.widget.ListView.makeAndAddView(ListView.java:1970)
at android.widget.ListView.fillDown(ListView.java:704)
at android.widget.ListView.fillFromTop(ListView.java:765)
at android.widget.ListView.layoutChildren(ListView.java:1744)
at android.widget.AbsListView.onLayout(AbsListView.java:2161)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutHorizontal(LinearLayout.java:1730)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1496)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1741)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1585)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1494)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.widget.FrameLayout.layoutChildren(FrameLayout.java:323)
at android.widget.FrameLayout.onLayout(FrameLayout.java:261)
at com.android.internal.policy.DecorView.onLayout(DecorView.java:724)
at android.view.View.layout(View.java:17523)
at android.view.ViewGroup.layout(ViewGroup.java:5612)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:2342)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2069)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1246)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6301)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:871)
at android.view.Choreographer.doCallbacks(Choreographer.java:683)
at android.view.Choreographer.doFrame(Choreographer.java:619)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:857)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6077)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:866)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:756) ```