【问题标题】:ListView inside of ViewPagerViewPager 内的 ListView
【发布时间】:2013-01-26 01:03:06
【问题描述】:

所以我在 ViewPager 中有一个 ListView。

我在一个布局 (add_site.xml) 中有 ListView 和一个 EditText 字段,该字段将填充另一个布局 (main.xml) 上的 ListView onClick

我收到一个 NPE 错误,因为我试图将 ArrayAdapter 全局化,认为这是能够在 ViewPager 中与这两种布局对话的正确方法。

很明显,我的 android 开发技能不是那么好。我对此很陌生。

因此,感谢您的帮助!

这是我的代码。

这是 PagerAdapter 开始的地方

 private class MyPagerAdapter extends PagerAdapter {

    final ViewPager mPager = (ViewPager) findViewById(R.id.fieldspager);

    public int getCount() {
        return 3;
    }

    public Object instantiateItem(View collection, int position) {

        LayoutInflater inflater = (LayoutInflater) collection.getContext()
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        ListView lv = (ListView)findViewById(android.R.id.list);

        final ArrayList<String> siteList = new ArrayList<String>();
        final ArrayAdapter<String> aa;
        aa = new ArrayAdapter<String>(getBaseContext(), R.layout.list_row, siteList);
        lv.setAdapter(aa);

        int resId = 0;
        View view = null;
        switch (position) {
            case 0:
                resId = R.layout.field01;
                view = inflater.inflate(resId, null);
                ((ViewPager) collection).addView(view, 0);

                return view;

            case 1: //ListView lives in here.
                resId = R.layout.add_site; 
                view = inflater.inflate(resId, null);
                Button addSiteButton = (Button)view.findViewById(R.id.addSiteButton);
                ((ViewPager) collection).addView(view, 0);
                addSiteButton.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                      mPager.setCurrentItem(2, true);
                    }

                });

                //I originally had the ArrayAdapter code here, but thought it needed to be global so I moved it up.

                return view;

            case 2:
                resId = R.layout.main;
                view = inflater.inflate(resId, null);
                Button signInButton = (Button)view.findViewById(R.id.sign_in_button);

                //This is where the EditText lives
                final EditText editText = (EditText)view.findViewById(R.id.textViewId);
                ((ViewPager) collection).addView(view, 0);
                signInButton.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        //This is where the button click happens
                        siteList.add(0, editText.getText().toString());
                        aa.notifyDataSetChanged();
                        editText.setText("");
                        mPager.setCurrentItem(1, true);
                    }

                });
                return view;
        }

        return view;
    }

提前致谢!

【问题讨论】:

  • 我不是 100% 确定您希望您的 arrayadapter 做什么,但通常建议的片段间通信模式是在 Activity 和片段之间建立(一个)接口。该接口列出了您希望片段访问的活动中的方法。片段保存对活动转换的引用作为 onattach 方法中的接口。同时,如果您需要从活动中调用片段中的方法,您只需将它们定义为公共并调用它们。这种模式减少了耦合。如果你需要,我可以在几个小时内给出一个代码示例。
  • 你从哪里得到 npe?
  • @fedepaol 我在lv.setAdapter(aa);获得NPE
  • @anthropomo 我的问题是基于缺乏知识。我可能有一些事情不正常,但只是不知道该顺序应该是什么。我想要它做的是在main 布局中的EditText 中键入一些内容,然后在相邻布局add_site 上填充ListView
  • 我之前的评论误读了您的意图。在您的 NPE 行之前添加一些日志记录,以便我们可以看到哪个对象为空。 if(lv == null) Log.v("lv", "null"); else Log.v("aa", "null") 之类的,然后发布 logcat。

标签: android android-layout android-listview android-viewpager android-pageradapter


【解决方案1】:

在我看来,您的 NPE 的直接原因是这一行:

ListView lv = (ListView)findViewById(android.R.id.list);

我猜你打算做一些更接近这个的事情:

ListView lv = (ListView) layoutInflater.inflate(R.layout.add_site, null);

我不清楚你的代码的最终目标,所以我认为我不能在那里提供建议,但我认为你会发现这个示例在未来会提供非常丰富的信息:

Android ViewPager and ListViews

坚持住。安卓用户界面很乱。继续提问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多