在 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.listView2R.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); 再次,您使用了两次setContentViewsetContentView(R.layout.log)onPostExecute 的开头和setContentView(view) 的末尾。第二个覆盖第一个。 如果我删除了开头出现的setcontentview(R.layout.log),那么它再次给出空指针异常

以上是关于在 customadapter 中设置 setAdapter() 的空指针的主要内容,如果未能解决你的问题,请参考以下文章

Swift 里 SetAdding & Removing Elements

在 customAdapter.notifyDataSetChanged 之后 ListView 不更新

在xib中设置accessibilityIdentifier nil时,必须从用户定义的运行时属性中设置

在 RichTextBox WPF 中设置文化/语言

当在docker容器中设置php时,如何在vscode中设置php可执行路径php.validate.executablePath?

在代码中设置 IBOutlet 的 Auto Layout 约束