【问题标题】:NullPointerExcepter Error when using List Adapter and Custom List View in Android Studio在 Android Studio 中使用列表适配器和自定义列表视图时出现 NullPointerExcepter 错误
【发布时间】:2018-07-16 20:27:17
【问题描述】:

一直在尝试在 android studio 中编写应用程序。应用程序的一部分必须解析 JSON 格式的文档并为每个实例显示两个 TextView 数据。一个是信号,另一个是噪声。我正在尝试制作一个自定义列表视图,以防我想为每个实例添加更多细节。我也想让它全部包含在一个 ScrollView 中。我最初在解析文档时没有问题,但现在我尝试实现 ListAdapter 时遇到了问题。

我的代码给了我错误...

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.yesinc.tsi880, PID: 4919
                  java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference
                      at com.yesinc.tsi880.TelemetryActivity$JSONTask.onPostExecute(TelemetryActivity.java:136)
                      at com.yesinc.tsi880.TelemetryActivity$JSONTask.onPostExecute(TelemetryActivity.java:50)

不确定问题出在我尝试解析的文档还是 java 代码本身。任何帮助将非常感激。代码如下。

import android.content.Context;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.yesinc.tsi880.models.SondeModel;
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.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;




import android.widget.ArrayAdapter;



public class TelemetryActivity extends AppCompatActivity {

    private TextView tvData;
    private ListView lvSondes;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_telemetry);

        ListView lvSondes = findViewById(R.id.lvSondes);

        //new JSONTask().execute("http://172.16.5.70/plots/sigstr2.txt");
    }

    public class JSONTask extends AsyncTask<String, String, List<SondeModel> >{

        @Override
        protected List<SondeModel> doInBackground(String... params) {
            HttpURLConnection connection = null;
            BufferedReader reader = null;

            try {
                URL url = new URL(params[0]);
                connection = (HttpURLConnection) url.openConnection();
                connection.connect();

                InputStream stream = connection.getInputStream();

                reader = new BufferedReader(new InputStreamReader(stream));

                StringBuffer buffer = new StringBuffer();

                String line;
                while((line=reader.readLine()) != null){
                    buffer.append(line);
                }

                String finalJson = buffer.toString();

                JSONObject parentObject = new JSONObject(finalJson);
                JSONObject parentArray0 = parentObject.getJSONObject("0");
                JSONObject parentArray1 = parentObject.getJSONObject("1");

                List<SondeModel> sondeModelList = new ArrayList<>();

                //StringBuffer finalBufferedData = new StringBuffer();
                for(int i=0; i<8; i++){

                    String sonde = String.valueOf(i);
                    JSONObject finalObject = parentArray0.getJSONObject(sonde);
                    SondeModel sondeModel = new SondeModel();
                    sondeModel.setNoisedbm(finalObject.getString("noisedbm"));
                    sondeModel.setSigdbm(finalObject.getString("sigdbm"));

                    //String noiseDBM = finalObject.getString("noisedbm");
                    //String sigDBM = finalObject.getString("sigdbm");

                    sondeModelList.add(sondeModel);
                }

                for(int i=0; i<8; i++){

                    String sonde = String.valueOf(i);
                    JSONObject finalObject = parentArray1.getJSONObject(sonde);
                    SondeModel sondeModel = new SondeModel();
                    sondeModel.setNoisedbm(finalObject.getString("noisedbm"));
                    sondeModel.setSigdbm(finalObject.getString("sigdbm"));

                    //String noiseDBM = finalObject.getString("noisedbm");
                    //String sigDBM = finalObject.getString("sigdbm");

                    sondeModelList.add(sondeModel);
                }
                return sondeModelList;

            } catch (MalformedURLException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            } finally {
                if(connection != null) {
                    connection.disconnect();
                }try {
                    if(reader != null) {
                        reader.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            return null;
        }

        @Override
        protected void onPostExecute(List<SondeModel> result) {
            super.onPostExecute(result);

            SondeAdapter adapter = new SondeAdapter(getApplicationContext(), R.layout.row, result);
            lvSondes.setAdapter(adapter);

            // TODO need to set a data to the List
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.navigation, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int id = item.getItemId();
        //noinspection SimplifiableIfStatement
        if (id == R.id.navigation_telemetry) {
            new JSONTask().execute("http://172.16.5.70/plots/sigstr2.txt");
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    public class SondeAdapter extends ArrayAdapter{
        public List<SondeModel> sondeModelList;
        private int resource;
        private LayoutInflater inflater;
        public SondeAdapter(Context context, int resource, List<SondeModel> objects) {
            super(context, resource, objects);
            sondeModelList = objects;
            this.resource = resource;
            inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        }



        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            if(convertView == null){
                convertView = inflater.inflate(resource, null);
            }

            TextView sig;
            TextView noise;

            sig = (TextView)convertView.findViewById(R.id.sig);
            noise = (TextView)convertView.findViewById(R.id.noise);

            sig.setText(sondeModelList.get(position).getSigdbm());
            noise.setText(sondeModelList.get(position).getNoisedbm());

            return convertView;
        }
    }

}

【问题讨论】:

    标签: java android json android-studio nullpointerexception


    【解决方案1】:
    ListView lvSondes = findViewById(R.id.lvSondes);
    

    您在 onCreate 方法中重新声明了 lvSondes。类成员列表视图从不使用,也从不初始化。而是初始化本地 lvSondes。此变量将不在范围内,并且对 AsyncTask 不可见。异步任务将使用成员变量,该成员变量将为空。

    解决方案:从声明的行中删除 ListView 并初始化成员变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多