BaseAdapter.getCount () генерирует исключение нулевого указателя, в то время как указанный объект абсолютно не равен нулю - PullRequest
0 голосов
/ 04 мая 2019

Я создаю фоновый сервер и приложение для Android для проекта заказа еды.Существует функция, которая помогает клиентам убедиться, занят ли стол или нет.Логика написана в TableActivity.java, который я покажу ниже.В основном, элемент для надувания представления - это ImageView и TextView.ImageView либо свободен, либо занят, а TextView - это номер таблицы.Фоновый код в порядке, который возвращает строку json, которая содержит номер таблицы и флаг таблицы (1 вакантно; 0 занято).Но LogCat дал мне исключение нулевого указателя.Буду признателен, если вы дадите несколько советов.

Я использую tomcat 7 в качестве серверного программного обеспечения и сервлета для обработки соединения между клиентом и базой данных.Фон в порядке, и я думаю, что проблема в моих кодах клиента Android.Версия Android SDK - 27.

public class TableActivity extends Activity {
    GridView gv;
    List<Table> list;
    MyAdapter myAdapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.table);
        list = new ArrayList<Table>(); //Table is an Entity class 
        gv = findViewById(R.id.table_gridView);
        myAdapter = new MyAdapter();
        //init network
        String url = "http://10.0.2.2:8080/WL_Server/TableServlet";
        new MyTask().execute(url);
        gv.setAdapter(myAdapter);


    }

    /*@param: The url of server servlet
     Visit target url, gets the output of the server. The function returns a json that contains info of Tabletbl table.
    * */
    String doGetTableMsg(String url){
        String json = OkHttpUtil.doGet(url);
        return json;
    }


    //异步任务,处理网络请求
    class MyTask extends AsyncTask<String, Integer, String>{

        @Override
        protected String doInBackground(String... strings) {
            return doGetTableMsg(strings[0]);   
        }


        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            Gson gson = new Gson();
            Type type = new TypeToken<List<Table>>(){}.getType();
            list = gson.fromJson(s, type);  
            myAdapter.notifyDataSetChanged();
        }
    }

    class MyAdapter extends BaseAdapter {



        @Override
        public int getCount() {
            //This return sentence is where the exception happened. But this 
            // list object has been initiated and assigned with value already?
            return list.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

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


        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            View view1;
            if (view == null){
                //Inflate a view from an XML resource.
                view1 = View.inflate(getApplicationContext(), R.layout.table_item, null);
            }else {
                view1 = view;
            }


            ImageView imageView1 = view1.findViewById(R.id.itemImageView1);
            TextView textView1 = view1.findViewById(R.id.itemTextView1);

            //Logic to decide whether table is vacant or not. Totally fine.
            Table table = list.get(i);
            int flag = table.getFlag();
            if (flag == 0){
                imageView1.setImageResource(R.drawable.kongwei);
            }else {
                imageView1.setImageResource(R.drawable.youren);
            }
            textView1.setText(table.getTid() + "");
            return view1;
        }
    }

}

Я ожидаю, что эмулятор покажет вид, но он дал мне исключение нулевого указателя, как показано ниже:

java.lang.NullPointerException: Попытка вызвать метод интерфейсаint java.util.List.size () для пустой ссылки на объект по адресу xuming.com.wl_client.TableActivity $ MyAdapter.getCount (TableActivity.java:82)

Строка 82 равна return list.size();

Обычная причина, по которой это происходит, - это использование [findViewById] вместо [View.findViewById] в методе getItem, но я уже использовал последний.Ценю, и если вам нужно больше кодов, я предоставлю.

Ответы [ 2 ]

1 голос
/ 04 мая 2019

Попробуйте следующее:

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.table);
    list = new ArrayList<Table>(); //Table is an Entity class 
    gv = findViewById(R.id.table_gridView);

    //myAdapter = new MyAdapter(); //remove; intialize after web request has a value

    String url = "http://10.0.2.2:8080/WL_Server/TableServlet";
    new MyTask().execute(url);
}

class MyTask extends AsyncTask<String, Integer, String>{
    ...
    ...
    ...

    @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        Gson gson = new Gson();
        Type type = new TypeToken<List<Table>>(){}.getType();
        list = gson.fromJson(s, type);  //debug here, maybe gson is returning null

        //inizialize adapter whit list
        myAdapter = new MyAdapter(list);
        gv.setAdapter(myAdapter);
    }
}

class MyAdapter extends BaseAdapter {
        List<Table> adptList;

        public MyAdapter(List<Table> list){
            this.adptList = list;
        }

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

Поместите setAdpetr() после AsyncTask завершения выполнения и добавьте конструктор для вашего адаптера.

0 голосов
/ 04 мая 2019

Вы должны поместить gv.setAdapter(myAdapter); в onPostExecute()

   @Override
    protected void onPostExecute(String s) {
        super.onPostExecute(s);
        Gson gson = new Gson();
        Type type = new TypeToken<List<Table>>(){}.getType();
        list = gson.fromJson(s, type);  
        gv.setAdapter(myAdapter);
        myAdapter.notifyDataSetChanged();
    }

, а также изменить getItem() и getItemId() на:

    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return list.get(i).getId;
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...