如何从Sample中将ListFragment实现到项目中?

时间:2012-04-21 00:27:36

标签: android listview listactivity listadapter android-listfragment

我有一个可以调用ListFragment的Pager适配器:

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

3 个答案:

答案 0 :(得分: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 现在您的图像适配器正常工作,因此无论您在互联网上找到ListArrayAdapter,您只需要复制类文件,调用PagerAdapter中的ArraySupport并将ListActivity更改为{{ 1}}。

答案 1 :(得分:0)

没有关于'崩溃'的任何细节,很难找出出错的地方。但是,我最好的猜测是它是NullPointerException因为你似乎试图从ListFragment的适配器获取图像下载器,而适配器尚未初始化。

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

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

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

如果设定,可能会有其他因素导致您的问题,但没有任何具体的堆栈痕迹,我们只能猜测......

答案 2 :(得分:0)

查看错误消息,然后查看您的onCreateView() - 方法。错误消息显示您正在尝试向父级添加View已经父级。

您获得IllegalStateException的原因是因为您试图通过(ViewGroup) container returncontainer中将onCreateView(...)作为孩子添加到自己身上1}}。当然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。从setListAdapter(new ImageAdapter());移除对Activity的来电,然后将implements RadioGroup.OnCheckedChangeListener移至ListFragment