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