Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android BaseAdapter.getCount()在引用的对象绝对不为null时引发null指针异常_Android_Nullpointerexception_Sdk_Android Adapter_Baseadapter - Fatal编程技术网

Android BaseAdapter.getCount()在引用的对象绝对不为null时引发null指针异常

Android BaseAdapter.getCount()在引用的对象绝对不为null时引发null指针异常,android,nullpointerexception,sdk,android-adapter,baseadapter,Android,Nullpointerexception,Sdk,Android Adapter,Baseadapter,我正在为食品订购项目构建后台服务器和android应用程序。 有一个功能可以帮助客户确定桌子是否被占用。逻辑写在TableActivity.java中,我将在下面展示。基本上,为视图充气的项目是ImageView和TextView。ImageView为空或已占用,而TextView为表的编号。 返回包含 表编号和表标志(1个空闲;0个已占用)。但是LogCat给了我空指针异常。如果你能给我一些建议,我将不胜感激 我使用Tomcat7作为服务器软件,使用servlet处理客户端和数据库之间的连接。

我正在为食品订购项目构建后台服务器和android应用程序。 有一个功能可以帮助客户确定桌子是否被占用。逻辑写在TableActivity.java中,我将在下面展示。基本上,为视图充气的项目是ImageView和TextView。ImageView为空或已占用,而TextView为表的编号。 返回包含 表编号和表标志(1个空闲;0个已占用)。但是LogCat给了我空指针异常。如果你能给我一些建议,我将不胜感激

我使用Tomcat7作为服务器软件,使用servlet处理客户端和数据库之间的连接。背景不错,我想问题出在我的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;
        }
    }

}
公共类TableActivity扩展活动{
GridView gv;
名单;
我的适配器我的适配器;
@凌驾
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.table);
list=new ArrayList();//表是一个实体类
gv=findViewById(R.id.table\u gridView);
myAdapter=新的myAdapter();
//初始化网络
字符串url=”http://10.0.2.2:8080/WL_Server/TableServlet";
新建MyTask().execute(url);
gv.设置适配器(myAdapter);
}
/*@param:服务器servlet的url
访问目标url,获取服务器的输出。该函数返回一个包含Tabletbl table信息的json。
* */
字符串doGetTableMsg(字符串url){
字符串json=OkHttpUtil.doGet(url);
返回json;
}
//异步任务,处理网络请求
类MyTask扩展了AsyncTask{
@凌驾
受保护的字符串背景(字符串…字符串){
返回doGetTableMsg(字符串[0]);
}
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
Gson Gson=新的Gson();
Type Type=new-TypeToken(){}.getType();
list=gson.fromJson(s,type);
myAdapter.notifyDataSetChanged();
}
}
类MyAdapter扩展了BaseAdapter{
@凌驾
public int getCount(){
//这个返回语句就是异常发生的地方
//列表对象是否已启动并已分配值?
返回list.size();
}
@凌驾
公共对象getItem(int i){
返回null;
}
@凌驾
公共长getItemId(int i){
返回0;
}
@凌驾
公共视图getView(int i、视图视图、视图组视图组){
视图1;
如果(视图==null){
//从XML资源膨胀视图。
view1=View.inflate(getApplicationContext(),R.layout.table_项,null);
}否则{
视图1=视图;
}
ImageView imageView1=view1.findViewById(R.id.itemImageView1);
TextView textView1=view1.findViewById(R.id.itemTextView1);
//决定桌子是否空的逻辑。完全正确。
Table=list.get(i);
int flag=table.getFlag();
如果(标志==0){
imageView1.setImageResource(R.drawable.kongwei);
}否则{
imageView1.setImageResource(R.drawable.youren);
}
textView1.setText(table.getId()+);
返回视图1;
}
}
}
我希望emulator会显示视图,但它给了我空指针异常,如下所示:

java.lang.NullPointerException:尝试对空对象引用调用接口方法“int java.util.List.size() 在xuming.com.wl_client.TableActivity$MyAdapter.getCount(TableActivity.java:82)

第82行是
返回list.size()

发生这种情况的正常原因可能是在getItem方法中使用[findViewById]而不是[View.findViewById],但我已经使用了后者。
非常感谢,如果您需要更多代码,我将提供。

您应该放置
gv.setAdapter(myAdapter)
onPostExecute()中

请尝试以下操作:

@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();
        }
        ...
        ...
        ...
}
@覆盖
创建时受保护的void(@Nullable Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.table);
list=new ArrayList();//表是一个实体类
gv=findViewById(R.id.table\u gridView);
//myAdapter=new myAdapter();//删除;在web请求具有值后初始化
字符串url=”http://10.0.2.2:8080/WL_Server/TableServlet";
新建MyTask().execute(url);
}
类MyTask扩展了AsyncTask{
...
...
...
@凌驾
受保护的void onPostExecute(字符串s){
super.onPostExecute(s);
Gson Gson=新的Gson();
Type Type=new-TypeToken(){}.getType();
list=gson.fromJson(s,type);//在这里调试,可能gson返回null
//将适配器whit列表序列化
myAdapter=新的myAdapter(列表);
gv.设置适配器(myAdapter);
}
}
类MyAdapter扩展了BaseAdapter{
列表adptList;
公共MyAdapter(列表){
this.adptList=列表;
}
@凌驾
public int getCount(){
返回此.adptList.size();
}
...
...
...
}

将您的
setAdpetr()
放在
AsyncTask
完成执行之后,并为适配器添加构造函数。

是的,这就是问题所在。谢谢,但仍在考虑原因。不客气,原因是您正在使用空列表设置适配器,因此您应该等待列表获得值。请将其标记为正确,如果有帮助,请投票:)是的..但s
    @Override
    public Object getItem(int i) {
        return list.get(i);
    }

    @Override
    public long getItemId(int i) {
        return list.get(i).getId;
    }
@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();
        }
        ...
        ...
        ...
}