通过片段重新加载列表视图
Reload a listview through fragments
我对使用片段还比较陌生,当我在 FragmentActivity
中使用通用图像时,我很难弄清楚如何重新加载在 BaseFragment
中初始化的列表视图listview
加载程序并让它在我的项目中正常工作,我只需要弄清楚如何重新加载它而不重新加载整个 activity。
这是我的 Basefragment,我认为 listview
首先被初始化:
public class ImageListFragment extends AbsListViewBaseFragment {
public static final int INDEX = 0;
String[] imageUrls = Constants2photo.IMAGES.toArray(new String[Constants2photo.IMAGES.size()]);
DisplayImageOptions options;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.displayer(new RoundedBitmapDisplayer(20))
.build();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fr_image_list, container, false);
listView = (ListView) rootView.findViewById(R.id.lister);
((ListView) listView).setAdapter(new ImageAdapter());
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
startImagePagerActivity(position);
}
});
return rootView;
}
...
这是我的 片段 activity onCreate:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int frIndex = getIntent().getIntExtra(Constants2photo.Extra.FRAGMENT_INDEX, 0);
Fragment fr;
String tag;
int titleRes;
switch (frIndex) {
default:
case ImageListFragment.INDEX:
tag = ImageListFragment.class.getSimpleName();
fr = getSupportFragmentManager().findFragmentByTag(tag);
if (fr == null) {
fr = new ImageListFragment();
}
titleRes = R.string.ac_name_image_list;
break;
case ImagePagerFragment.INDEX:
tag = ImagePagerFragment.class.getSimpleName();
fr = getSupportFragmentManager().findFragmentByTag(tag);
if (fr == null) {
fr = new ImagePagerFragment();
fr.setArguments(getIntent().getExtras());
}
titleRes = R.string.ac_name_image_pager;
break;
}
setTitle(titleRes);
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fr, tag).commit();
}
编辑
图像适配器class:
class ImageAdapter extends BaseAdapter {
private LayoutInflater inflater;
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
ImageAdapter() {
inflater = LayoutInflater.from(getActivity());
}
@Override
public int getCount() {
return imageUrls.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder holder;
if (convertView == null) {
view = inflater.inflate(R.layout.item_list_image, parent, false);
holder = new ViewHolder();
holder.text = (TextView) view.findViewById(R.id.text);
holder.image = (ImageView) view.findViewById(R.id.image);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.text.setText("Item " + (position + 1));
ImageLoader.getInstance().displayImage(imageUrls[position], holder.image, options, animateFirstListener);
return view;
}
}
那么如何从片段 activity 重新加载列表视图?如果我需要 post 更多代码,请告诉我,真的卡在这一个上了。
在您的 ImageListFragment
中,您可以创建一个方法,例如:
public void updateList(){
this.ListView.getAdapter().notifyDataSetChanged();
...other stuff you wanna do to refresh your list....
}
然后在您的 activity 中,您可以随时通过以下方式刷新片段中的列表:
fr = new ImageListFragment();
...
fr.updateList();
在你的片段中做这样的事情
注意 看来您正在使用来自通用图像加载器 (nostra) 的示例。在示例中,他们使用的 AbsListView
其 getAdapter
方法 returns a ListAdapter
和 notifyDataSetChanged()
不是其中的一部分。这就是为什么您需要将适配器转换为 BaseAdapter
public void refresh()
{
((BaseAdapter)this.listView.getAdapter()).notifyDataSetChanged();
}
并在 activity
中进行刷新
Fragment fr = getSupportFragmentManager().findFragmentById(R.id.content);
if(fr instanceOf ImageListFragment)
((ImageListFragment)fr).refresh();
我对使用片段还比较陌生,当我在 FragmentActivity
中使用通用图像时,我很难弄清楚如何重新加载在 BaseFragment
中初始化的列表视图listview
加载程序并让它在我的项目中正常工作,我只需要弄清楚如何重新加载它而不重新加载整个 activity。
这是我的 Basefragment,我认为 listview
首先被初始化:
public class ImageListFragment extends AbsListViewBaseFragment {
public static final int INDEX = 0;
String[] imageUrls = Constants2photo.IMAGES.toArray(new String[Constants2photo.IMAGES.size()]);
DisplayImageOptions options;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisk(true)
.considerExifParams(true)
.displayer(new RoundedBitmapDisplayer(20))
.build();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fr_image_list, container, false);
listView = (ListView) rootView.findViewById(R.id.lister);
((ListView) listView).setAdapter(new ImageAdapter());
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
startImagePagerActivity(position);
}
});
return rootView;
}
...
这是我的 片段 activity onCreate:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
int frIndex = getIntent().getIntExtra(Constants2photo.Extra.FRAGMENT_INDEX, 0);
Fragment fr;
String tag;
int titleRes;
switch (frIndex) {
default:
case ImageListFragment.INDEX:
tag = ImageListFragment.class.getSimpleName();
fr = getSupportFragmentManager().findFragmentByTag(tag);
if (fr == null) {
fr = new ImageListFragment();
}
titleRes = R.string.ac_name_image_list;
break;
case ImagePagerFragment.INDEX:
tag = ImagePagerFragment.class.getSimpleName();
fr = getSupportFragmentManager().findFragmentByTag(tag);
if (fr == null) {
fr = new ImagePagerFragment();
fr.setArguments(getIntent().getExtras());
}
titleRes = R.string.ac_name_image_pager;
break;
}
setTitle(titleRes);
getSupportFragmentManager().beginTransaction().replace(android.R.id.content, fr, tag).commit();
}
编辑
图像适配器class:
class ImageAdapter extends BaseAdapter {
private LayoutInflater inflater;
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
ImageAdapter() {
inflater = LayoutInflater.from(getActivity());
}
@Override
public int getCount() {
return imageUrls.length;
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolder holder;
if (convertView == null) {
view = inflater.inflate(R.layout.item_list_image, parent, false);
holder = new ViewHolder();
holder.text = (TextView) view.findViewById(R.id.text);
holder.image = (ImageView) view.findViewById(R.id.image);
view.setTag(holder);
} else {
holder = (ViewHolder) view.getTag();
}
holder.text.setText("Item " + (position + 1));
ImageLoader.getInstance().displayImage(imageUrls[position], holder.image, options, animateFirstListener);
return view;
}
}
那么如何从片段 activity 重新加载列表视图?如果我需要 post 更多代码,请告诉我,真的卡在这一个上了。
在您的 ImageListFragment
中,您可以创建一个方法,例如:
public void updateList(){
this.ListView.getAdapter().notifyDataSetChanged();
...other stuff you wanna do to refresh your list....
}
然后在您的 activity 中,您可以随时通过以下方式刷新片段中的列表:
fr = new ImageListFragment();
...
fr.updateList();
在你的片段中做这样的事情
注意 看来您正在使用来自通用图像加载器 (nostra) 的示例。在示例中,他们使用的 AbsListView
其 getAdapter
方法 returns a ListAdapter
和 notifyDataSetChanged()
不是其中的一部分。这就是为什么您需要将适配器转换为 BaseAdapter
public void refresh()
{
((BaseAdapter)this.listView.getAdapter()).notifyDataSetChanged();
}
并在 activity
中进行刷新Fragment fr = getSupportFragmentManager().findFragmentById(R.id.content);
if(fr instanceOf ImageListFragment)
((ImageListFragment)fr).refresh();