gpt4 book ai didi

java - 无法在 ListView 中使用自定义项目布局正确显示图像

转载 作者:行者123 更新时间:2023-11-30 11:59:10 30 4
gpt4 key购买 nike

我正在使用 ListView 来显示我的自定义项目布局,其中可能包含一些 TextView 和一个 ImageView。

这是我制作的项目布局(post_item.xml):


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="60dip"
android:padding="5dip"
>

<TextView android:id="@+id/listItem_title"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_weight="1"
/>
<FrameLayout android:id="@+id/listItem_frameContent"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@id/userStream_listItem_title"
android:layout_weight="1"
>
</FrameLayout>

</RelativeLayout>

我最初没有将 ImageView 放在 xml 布局中,但是当我需要以编程方式将其插入 FrameLayout 时(我还在需要时将另一个 View 放入其中)。因此,会有一些项目包含 ImageView,而哪些则没有。

我从 Internet(通过 URL)获取图像以填充 ImageView,将其解码为位图,并将其作为位图变量保存在表示自定义项布局的类(类 PostItem)中。

当 Activity 第一次显示时它看起来不错,但是当我滚动浏览项目时出现了问题,不应显示任何图像的项目显示了另一个应该显示的图像,尽管它们不显示没有任何 ImageView(因为我没有插入它)。

我正在使用 SDK 1.6 和模拟器。没有在真实设备上尝试过,因为我没有。

这是我的适配器代码:


private class PostItemAdapter extends ArrayAdapter<PostItem> {
private List<PostItem> mPostItems;

public PostItemAdapter(Context context, int textViewResourceId, List<PostItem> postItems) {
super(context, textViewResourceId, postItems);

mPostItems = postItems;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;

if (view == null) {
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
view = layoutInflater.inflate(R.layout.post_item, null);
}

PostItem postItem = mPostItems.get(position);
if (postItem != null) {
final FrameLayout contentFrame = (FrameLayout) view.findViewById(R.id.listItem_frameContent);
final TextView titleTextView = (TextView) view.findViewById(R.id.listItem_title);

if (titleTextView != null) {
titleTextView.setText(postItem.getTitle());
}
if (contentFrame != null) {
if (postItem.hasImagePreview()) {
final ImageView previewImageView = new ImageView(getApplicationContext());
previewImageView.setId(LIST_ITEM_IMAGEVIEW_ID);
previewImageView.setAdjustViewBounds(true);
previewImageView.setMaxHeight(75);
previewImageView.setMaxWidth(75);
previewImageView.setImageBitmap(postItem.getImagePreview());
final RelativeLayout.LayoutParams layoutParams =
new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_TOP);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
contentFrame.addView(previewImageView, layoutParams);
}
if (postItem.hasContent()) {
final TextView contentTextView = new TextView(getApplicationContext());
contentTextView.setText(postItem.getContent());
final RelativeLayout.LayoutParams layoutParams =
new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_PARENT,
RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.BELOW, LIST_ITEM_IMAGEVIEW_ID);
layoutParams.addRule(RelativeLayout.ALIGN_LEFT, LIST_ITEM_IMAGEVIEW_ID);
layoutParams.alignWithParent = true;
contentFrame.addView(contentTextView, layoutParams);
}
}
}

return view;
}
}

这是准备元素的代码:



/* inside a method to prepare the items */
mPostItems = new ArrayList<PostItem>();
for (int i=0; i<total); i++) {
/* operation to generate titleToDisplay and contentToDisplay */
/* contentToDisplay might be null */
mPostItems.add(new PostItem(
titleToDisplay,
contentToDisplay,
generateImagePreview()));

}

/* another method */
private Bitmap generateImagePreview(ActivityObject object) {
Bitmap imagePreview = null;

if (/*some condition*/) {
try {
InputStream inStream = (InputStream) (new URL("http://a1.typepad.com/6a010535617444970b0133ecc20b29970b-120si")).getContent();
imagePreview = Drawable.createFromStream(inStream, "linkHref");
}
catch (MalformedURLException ex) {
Log.e("INSIDE generateImagePreview()", ex.getMessage());
}
catch (IOException ex) {
Log.e("INSIDE generateImagePreview()", ex.getMessage());
}
catch (Exception ex) {
Log.e("INSIDE generateImagePreview()", ex.getMessage());
}
}

return imagePreview;
}

这是模拟器中的错误还是我的代码中存在一些错误(可能是位图的内存问题)?请帮助我,我真的深陷其中。任何帮助或建议将不胜感激。提前致谢:)

最佳答案

单元格被列表重用,如果有与该项目相关联的图像,看起来您只是在更改您的 contentframe 图像。这意味着当没有图像并且您正在重复使用一个单元格时,它只会显示在转换 View 中传入的任何内容。如果没有图像,那么您应该删除 contentframe 的所有 subview 。

也就是说,通过更加简洁,您将来可能会得到更好的响应。提交一堆代码并花一些时间来解决问题会使阅读变得更加繁琐,因此很少有人会这样做。

关于java - 无法在 ListView 中使用自定义项目布局正确显示图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2691130/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com