在 customadapter 中设置 setAdapter() 的空指针
Posted
技术标签:
【中文标题】在 customadapter 中设置 setAdapter() 的空指针【英文标题】:Null pointer at setting setAdapter() in customadapter 【发布时间】:2015-04-22 09:01:45 【问题描述】:我有两个布局用于单个活动,我将动态更改布局。这里空指针出现在该行。
-
我尝试将视图从布局 1 更改为布局 2
listview.setadapter(listviewAdapter)
lv2.setAdapter(lva);
我得到的错误是
java.lang.NullPointerException at in.prasilabs.eagleeye.Log$DBSync.onPostExecute(Log.java:170)
public class Log extends Activity
ListView lv1;
ListView lv2;
@Override
protected void onCreate(Bundle savedInstanceState)
super.onCreate(savedInstanceState);
setContentView(R.layout.logmenu);
lv1 = (ListView) findViewById(R.id.listView1);
final Activity act = getParent();
String[] menu = new String[]
"Last 10 log",
"All logs (100)",
;
ArrayAdapter<String> menuadapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1,android.R.id.text1, menu);
lv1.setAdapter(menuadapter);
lv1.setOnItemClickListener(new OnItemClickListener()
DBSync dbs;
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
switch (position)
case 0:
dbs = new DBSync(position, Log.this, act);
dbs.execute();
break;
default:
break;
);
class DBSync extends AsyncTask<String, Void, Void>
int q;
String[] time = new String[]"No logs";
String[] status = new String[]"closed";
Context cnt;
Activity act;
public DBSync(int qu, Log lg, Activity ac)
q = qu;
cnt = lg;
act = ac;
@Override
protected Void doInBackground(String... params)
return null;
@Override
protected void onPostExecute(Void result)
//setContentView(R.layout.log);
time = new String[]"hii","yes";
status = new String[]"no", "yes";
boolean isFirstXml=true;//evaluatingConditionFunction();
LayoutInflater inflator=getLayoutInflater();
View view=inflator.inflate(isFirstXml?R.layout.logmenu:R.layout.log, null, false);
view.startAnimation(AnimationUtils.loadAnimation(cnt, android.R.anim.slide_out_right));
**setContentView(view);**
lv2 = (ListView) findViewById(R.id.listView2);
ListViewAdapter lva = new ListViewAdapter(act, time, status);
**lv2.setAdapter(lva);**
lv2.refreshDrawableState();
【问题讨论】:
findViewById, setContentView, 然后使用第一个 findViewById 的结果? ...祝你好运 我在这些方面做了很多尝试。我没有得到解决问题的方法。 您使用了两次setContentView
.. 这可能会导致findViewById
返回 null.. 如果您没有正确的组件
【参考方案1】:
你打电话给setContentView
两次。
setContentView(R.layout.log);
setContentView(R.layout.logmenu);
通过调用它两次,只会设置第二个 (R.layout.logmenu
)。我猜R.id.listView2
在R.layout.log
中。因此,(ListView) findViewById(R.id.listView2)
返回 null 并且 lv2
获得 null。当您尝试调用 lv2.setAdapter
时,您尝试在一个为 null 的对象上设置一个适配器 - 您的应用程序崩溃了。
【讨论】:
谢谢。我明白了。但我看到的是空白页而不是列表视图。 什么时候看到空白页?当您删除第二个setContentView
呼叫时?
protected void onPostExecute(Void result) setContentView(R.layout.log); lv2 = (ListView) findViewById(R.id.listView2); time = new String[]"hii","yes";状态=新字符串[]“否”,“是”;布尔 isFirstXml=true; LayoutInflater inflator=getLayoutInflater();查看 view=inflator.inflate(isFirstXml?R.layout.logmenu:R.layout.log, null,false); view.startAnimation(AnimationUtils.loadAnimation(cnt, android.R.anim.slide_out_right));设置内容视图(视图); ListViewAdapter lva = new ListViewAdapter(act, time,status); lv2.setAdapter(lva);
再次,您使用了两次setContentView
。 setContentView(R.layout.log)
在onPostExecute
的开头和setContentView(view)
的末尾。第二个覆盖第一个。
如果我删除了开头出现的setcontentview(R.layout.log)
,那么它再次给出空指针异常以上是关于在 customadapter 中设置 setAdapter() 的空指针的主要内容,如果未能解决你的问题,请参考以下文章
Swift 里 SetAdding & Removing Elements
在 customAdapter.notifyDataSetChanged 之后 ListView 不更新
在xib中设置accessibilityIdentifier nil时,必须从用户定义的运行时属性中设置
当在docker容器中设置php时,如何在vscode中设置php可执行路径php.validate.executablePath?