0

次のような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;

次に、ListViewFragmentに変更したいListActivityがあります。

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インターネットで見つけたものを何でも変更して実装する必要があります。

4

3 に答える 3

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;

FragmentListArraySupportはです。_FragmentActivityArrayListFragmentListFragment

これは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確認してください。インターネットで見つけたものはすべて、クラスファイルをコピーし、でArraySupportを呼び出して、に変更する必要があります。FragmentActivityListArrayAdapterPagerAdapterListActivityFragmentActivity

于 2012-04-21T16:24:01.173 に答える
0

「クラッシュ」の詳細がないと、何が問題になっているのかを特定するのは難しいです。ただし、アダプタがまだ初期化されていないときに、アダプタNullPointerExceptionからイメージダウンローダーを取得しようとしているように見えるためだと思います。ListFragment

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

の前の呼び出しがない場合setListAdapter(...)getListAdapter()上記のコードの最初の行で。を返しnullます。明らかに、それはあなたがそれから何も取得できないことを意味します。私はあなたがそれをこのようなものに変えたいと思うだろうと想像します:

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

それが設定されていると、問題を引き起こす他のことがあるかもしれませんが、具体的なスタックトレースがなければ、推測することしかできません...

于 2012-04-21T03:09:09.543 に答える
0

エラーメッセージを見てから、onCreateView()-methodを見てください。Viewエラーメッセージは、すでに親を持っている親にを追加しようとしていることを示しています。

を取得している理由は、を-ingすることで、子として自分自身IllegalStateExceptionに追加しようとしているためです。もちろん、すでに親がいるので、エラーが発生します。(ViewGroup) containerreturncontaineronCreateView(...)container

また、onCreateView()のアダプターに関する部分は、アダプターListFragmentを設定するまでまだアダプターを持っていないため、エラーをスローする可能性があります。toの呼び出し((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

于 2012-04-21T13:55:58.137 に答える