【发布时间】:2014-01-14 12:51:32
【问题描述】:
我正在尝试使用Universal Image Loader 在片段内使用SherlockNavigationDrawer 制作一个ListView
问题:通用图像加载器运行良好,但只显示单个列表项
InitialFragment.java
public class InitialFragment extends SherlockFragment
{
DisplayImageOptions options;
String[] imageUrls;
protected AbsListView listView;
public static ImageLoader imageLoader = ImageLoader.getInstance();
public static Fragment newInstance()
{
Fragment f = new InitialFragment();
return f;
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View simpleFragmentView = inflater.inflate(R.layout.fragment_menu1, container, false);
imageUrls = com.sherlock.test1.listview.Constants.IMAGES;
options = new DisplayImageOptions.Builder()
.showImageOnLoading(R.drawable.ic_stub)
.showImageForEmptyUri(R.drawable.ic_empty)
.showImageOnFail(R.drawable.ic_error)
.cacheInMemory(true)
.cacheOnDisc(true)
.considerExifParams(true)
.displayer(new RoundedBitmapDisplayer(20))
.build();
listView = (ListView) simpleFragmentView.findViewById(R.id.list2);
((ListView) listView).setAdapter(new ItemAdapter(getActivity()));
listView.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
Toast.makeText(getActivity(), "You Clicked at " + position, Toast.LENGTH_SHORT).show();
//startImagePagerActivity(position);
}
});
initImageLoader(getActivity());
return simpleFragmentView;
}
public static void initImageLoader(Context context)
{
// This configuration tuning is custom. You can tune every option, you may tune some of them,
// or you can create default configuration by
// ImageLoaderConfiguration.createDefault(this);
// method.
ImageLoaderConfiguration config = new ImageLoaderConfiguration.Builder(context)
.threadPriority(Thread.NORM_PRIORITY - 2)
.denyCacheImageMultipleSizesInMemory()
.discCacheFileNameGenerator(new Md5FileNameGenerator())
.tasksProcessingOrder(QueueProcessingType.LIFO)
.writeDebugLogs() // Remove for release app
.build();
// Initialize ImageLoader with configuration.
ImageLoader.getInstance().init(config);
}
public class ItemAdapter extends BaseAdapter
{
Context context;
ItemAdapter(Context context)
{
Log.d("dexter", "in ItemAdapter Constructor");
this.context = context;
}
private ImageLoadingListener animateFirstListener = new AnimateFirstDisplayListener();
public class ViewHolder
{
public TextView text;
public ImageView image;
}
@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)
{
Log.d("dexter", "in getView");
View view = convertView;
final ViewHolder holder;
if (convertView == null)
{
view = LayoutInflater.from(context).inflate(R.layout.item_list_image, parent, false);
//view = getActivity().getLayoutInflater().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));
InitialFragment.imageLoader.displayImage(imageUrls[position], holder.image, options, animateFirstListener);
return view;
}
}
public static class AnimateFirstDisplayListener extends SimpleImageLoadingListener
{
static final List<String> displayedImages = Collections.synchronizedList(new LinkedList<String>());
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage)
{
if (loadedImage != null)
{
ImageView imageView = (ImageView) view;
boolean firstDisplay = !displayedImages.contains(imageUri);
if (firstDisplay)
{
FadeInBitmapDisplayer.animate(imageView, 500);
displayedImages.add(imageUri);
}
}
}
}
}
fragment_menu1.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/linearlayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical" >
<ListView
android:id="@+id/list2"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
</ListView>
如果这有帮助:
1. InitialFragment 是一个子片段,在运行时在 FrameLayout 中膨胀
2.此代码在 Activity 中尝试时运行良好(没有任何片段)
3. ItemAdapter 的 getView() 只被调用一次
【问题讨论】:
-
您可以将您的解决方案添加到您的问题的答案中,以便遇到此类问题的任何人都可以在网络上找到此解决方案。
标签: android android-listview android-fragments universal-image-loader