Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/217.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在ListView中使用自定义项布局正确显示图像_Java_Android_Listview - Fatal编程技术网

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

Java 无法在ListView中使用自定义项布局正确显示图像,java,android,listview,Java,Android,Listview,我正在使用ListView显示我的自定义项目布局,其中可能包含一些TextView和ImageView 这是我制作的项目布局(post_item.xml): 最初,我不会将ImageView放在xml布局中,但当我需要以编程方式将其插入FrameLayout时,我会将其插入(需要时,我还会在其中放入另一个视图)。因此,有些项目中有ImageView,而有些项目中没有 我从Internet(通过URL)获取图像以填充ImageView,将其解码为位图,并将其作为位图变量保存在表示自定义项布局的

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

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


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

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

当活动第一次显示时,它看起来很好,但是当我滚动浏览项目时,出现了一个问题,不应该显示任何图像的项目显示了其他项目的图像,应该显示,尽管它们没有任何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;
        }
    }

私有类PostItemAdapter扩展了ArrayAdapter{
私人机构名单;
公共positemAdapter(上下文上下文、int textViewResourceId、列表positem){
super(上下文、textViewResourceId、positems);
mPostItems=positems;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=转换视图;
如果(视图==null){
LayoutInflater LayoutInflater=(LayoutInflater)getSystemService(布局\充气器\服务);
视图=布局更平坦。充气(R.layout.post_项,空);
}
positem positem=mPostItems.get(位置);
if(positem!=null){
final FrameLayout contentFrame=(FrameLayout)view.findViewById(R.id.listItem\u frameContent);
final TextView titleTextView=(TextView)view.findViewById(R.id.listItem_title);
if(titleTextView!=null){
titleTextView.setText(positem.getTitle());
}
if(contentFrame!=null){
if(positem.hasImagePreview()){
最终图像视图预览图像视图=新图像视图(getApplicationContext());
previewImageView.setId(列表项图像视图ID);
previewImageView.setAdjustViewBounds(true);
previewImageView.setMaxHeight(75);
previewImageView.setMaxWidth(75);
previewImageView.setImageBitmap(positem.getImagePreview());
最终相对Layout.LayoutParams LayoutParams=
新的RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_内容,
RelativeLayout.LayoutParams.WRAP_内容);
layoutParams.addRule(RelativeLayout.ALIGN\u PARENT\u TOP);
layoutParams.addRule(RelativeLayout.ALIGN\u PARENT\u LEFT);
addView(预览图像视图,布局参数);
}
if(positem.hasContent()){
final TextView contentTextView=new TextView(getApplicationContext());
contentTextView.setText(positem.getContent());
最终相对Layout.LayoutParams LayoutParams=
新的RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.FILL_父级,
RelativeLayout.LayoutParams.WRAP_内容);
layoutParams.addRule(RelativeLayout.down,列表项图像视图ID);
layoutParams.addRule(RelativeLayout.ALIGN\u LEFT,列表项目\u图像视图\u ID);
layoutParams.alignWithParent=true;
addView(contentTextView,layoutParams);
}
}               
}
返回视图;
}
}
这是准备项目的代码:



/* 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;
}

/*在一个方法中准备项目*/
mPostItems=newarraylist();

对于(int i=0;i单元格被列表重用,看起来只有当存在与该项相关联的图像时,您才会更改contentframe图像。这意味着当没有图像且您正在重用单元格时,它将只显示在convert视图中传入的内容。如果没有图像,则应删除contentf的所有子视图拉姆


也就是说,你将来可能会通过更简洁的方式得到更好的回答。发布一堆代码并花一段时间来解决这个问题会使阅读变得更麻烦,因此会有更少的人阅读。

非常感谢你的回答!正如你告诉我的,我从框架中删除了所有子视图,现在它工作正常:).也谢谢你的建议,从现在起我会尽量简洁一些。你真的救了我一天:D


/* 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;
}