【问题标题】:How to implements a ListFragment into your project from a Sample?如何从示例将 ListFragment 实施到您的项目中?
【发布时间】:2012-04-21 00:27:35
【问题描述】:

我有一个寻呼机适配器,它将像这样调用 ListFragment:

public Fragment getItem(int position) {
        Fragment fragment = new ListViewFragment();

        // set arguments here, if required
        Bundle args = new Bundle();
        fragment.setArguments(args);

        return fragment;

然后我有一个 ListActivity 我想更改为 ListViewFragment。

public class ImageListActivity extends ListActivity  implements RadioGroup.OnCheckedChangeListener {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.imagelist);

        RadioGroup radioGroup = (RadioGroup) findViewById(R.id.radioGroup);
        radioGroup.setOnCheckedChangeListener(this);

        setListAdapter(new ImageAdapter());
    }

    public void onCheckedChanged(RadioGroup group, int checkedId) {
        ImageDownloader.Mode mode = ImageDownloader.Mode.NO_ASYNC_TASK;

        if (checkedId == R.id.correctButton) {
            mode = ImageDownloader.Mode.CORRECT;
        }else if (checkedId == R.id.randomButton) {
                mode = ImageDownloader.Mode.NO_DOWNLOADED_DRAWABLE;
        }

        ((ImageAdapter) getListAdapter()).getImageDownloader().setMode(mode);
    }
}

但我真的不能让它发挥作用..我试过了:

public class ListViewFragment extends ListFragment {
    int mNum;
    Context ctx;
    View v;
    static int p; 

    /**
     * Create a new instance of CountingFragment, providing "num"
     * as an argument.
     */
    static ListFragment newInstance(int num) {
        ListFragment f = new ListFragment();

        // Supply num input as an argument.
        Bundle args = new Bundle();
        args.putInt("num", num);
        f.setArguments(args);

        return f;
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
            Bundle savedInstanceState) {


          v = inflater.inflate(R.layout.imagelist, container, false);
          ImageDownloader.Mode mode = ImageDownloader.Mode.NO_ASYNC_TASK;    
          mode = ImageDownloader.Mode.CORRECT;
          ((ImageAdapter) getListAdapter()).getImageDownloader().setMode(mode);
          setListAdapter(new ImageAdapter());            

          return container;      

    }
}

更新: - 我只是回答我自己的问题,并制作了一个小教程来解释初学者如何通过示例将 ListAdapter 实现到您的项目中。

我从一个示例中得到了这个 ListAdapter,只需将文件复制到我的项目中,如果你运行它,就会崩溃。

因此,您需要按照我的回答进行更改并实施您在互联网上找到的任何 ListArrayAdapter

【问题讨论】:

  • 这对 StackOverflow 来说不是一个很好的问题。问题是什么?当应用程序崩溃时,您会遇到什么错误?根据您提供给我们的信息,有数百种情况可能导致您的应用崩溃。
  • 好吧,我来自这里stackoverflow.com/questions/10082163/…。现在我想实现这个 listViewFragment

标签: android listview listactivity listadapter android-listfragment


【解决方案1】:

我终于把它付诸实施了。

嗯,首先你需要纠正来自PagerAdapter的电话。

public Fragment getItem(int position) {
        Fragment fragment = new FragmentListArraySupport.ArrayListFragment();

        // set arguments here, if required
        Bundle args = new Bundle();
        fragment.setArguments(args);

        return fragment;

FragmentListArraySupportFragmentActivityArrayListFragmentListFragment

这是FragmentListArraySupport 代码:

    public class FragmentListArraySupport extends FragmentActivity {

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            setTheme(SampleList.THEME); //Used for theme switching in samples
            super.onCreate(savedInstanceState);

            // Create the list fragment and add it as our sole content.
            if (getSupportFragmentManager().findFragmentById(android.R.id.content) == null) {
                ArrayListFragment list = new ArrayListFragment();
                getSupportFragmentManager().beginTransaction().add(android.R.id.content, list).commit();
            }
        }
        public static class ArrayListFragment extends ListFragment {

            @Override
            public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
                ImageDownloader.Mode mode = ImageDownloader.Mode.CORRECT;
                ImageAdapter imageAdapter = new ImageAdapter();
                imageAdapter.getImageDownloader().setMode(mode);
                setListAdapter(imageAdapter); 
            }

            @Override
            public void onListItemClick(ListView l, View v, int position, long id) {
                Log.i("FragmentList", "Item clicked: " + id);
            }
        }
   }

看到需要把ListActivity改成FragmentActivity 现在您的图像适配器工作了,所以无论您在 Internet 上找到什么 ListArrayAdapter,您只需要复制类文件,调用 PagerAdapter 中的 ArraySupport 并将 ListActivity 更改为 FragmentActivity

【讨论】:

    【解决方案2】:

    没有关于“崩溃”的任何细节,很难确定出了什么问题。但是,我最好的猜测是它是NullPointerException,因为您似乎正试图从ListFragment 的适配器获取图像下载器,而适配器尚未初始化。

    ((ImageAdapter) getListAdapter()).getImageDownloader().setMode(mode);
    setListAdapter(new ImageAdapter());  
    

    如果之前没有调用setListAdapter(...),上述代码第一行的getListAdapter() 将返回null。显然,这意味着您无法从中检索任何内容。我想你会想把它改成这样:

    ImageAdapter imageAdapter = new ImageAdapter();
    imageAdapter.getImageDownloader().setMode(mode);
    setListAdapter(imageAdapter);  
    

    设置完成后,可能还有其他原因导致您的问题,但没有任何具体的堆栈跟踪,我们只能进行猜测......

    【讨论】:

      【解决方案3】:

      查看错误消息,然后查看您的onCreateView()-方法。错误消息说您正在尝试将View 添加到父级,已经有一个父级。

      您获得IllegalStateException 的原因是因为您试图通过return-ing container 在您的onCreateView(...) 中将(ViewGroup) container 添加为自己的孩子。当然container 已经有一个父母,这就是你得到错误的原因。

      此外,onCreateView() 中有关适配器的部分可能会引发错误,因为您的ListFragment 在您设置适配器之前还没有适配器。对((ImageAdapter) getListAdapter()) 的调用将(可能)返回null,导致.getImageDownloader()(可能)抛出NullPointerException。在您的 Fragment 中尝试以下操作:

      @Override
      public void onActivityCreated(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
      
              // You should choose what mode you want,
              // ImageDownloader.Mode.NO_ASYNC_TASK or
              // ImageDownloader.Mode.CORRECT;... no use in setting it, just
              // to override it again 1 line later :p
              ImageDownloader.Mode mode = ImageDownloader.Mode.NO_ASYNC_TASK;
              mode = ImageDownloader.Mode.CORRECT;
      
              ImageAdapter mImageAdapter = new ImageAdapter();
              mImageAdapter.setMode(mode);
      
              setListAdapter(mImageAdapter);
      }
      
      @Override
      public View onCreateView(LayoutInflater inflater, ViewGroup container,
              Bundle savedInstanceState) {
      
            v = inflater.inflate(R.layout.imagelist, container,           
      
            return v; // notice you're returning your inflated View here,
                      // instead of container
      }
      

      更新

      另外,将您的ListActivity 更改为Activity(或FragmentActivity,如果您使用支持库)。从Activity 中删除对setListAdapter(new ImageAdapter()); 的调用,并将implements RadioGroup.OnCheckedChangeListener 移动到ListFragment

      【讨论】:

      • 好吧,我什么都试过了,还是不行,我认为 ListActivity 是错误的。我不知道如何实现这个 listfragment。
      • 对不起,我错过了;你不应该使用ListActivity,你应该使用常规的Activity(或者FragmentActivity,如果你使用支持库)。属于 Fragment 的业务逻辑应该包含在 Fragment 中。
      • 是的,谢谢你的帮助,我也发现了更多的问题,我用正确的代码给出了答案,我是安卓开发的新手,所以我只是复制了这个列表适配器的示例代码,因此,对于想要从示例中实现代码的初学者来说,这是一种方式。
      猜你喜欢
      • 2020-03-08
      • 2020-02-03
      • 1970-01-01
      • 1970-01-01
      • 2022-08-02
      • 2014-10-16
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多