我有一个可以调用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
。
答案 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;
FragmentListArraySupport
是FragmentActivity
而ArrayListFragment
是ListFragment
。
这是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
return
在container
中将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
。