Android ListView重复图像

Android ListView重复图像,android,listview,universal-image-loader,Android,Listview,Universal Image Loader,我正在android上实现一个包含imageview的listview,我遇到了一个问题: 当一行没有图像时,它会重复上一项的图像 这是我的适配器: public class NewsAdapter extends BaseAdapter { private final LayoutInflater inflater; private final Context context; private List<News> newsL

我正在android上实现一个包含imageview的listview,我遇到了一个问题: 当一行没有图像时,它会重复上一项的图像

这是我的适配器:

    public class NewsAdapter extends BaseAdapter {
        private final LayoutInflater inflater;
        private final Context context;
        private List<News> newsList;

        public NewsAdapter(List<News> newsList, Context context) {
            this.newsList = newsList;
            this.context = context;
            inflater = LayoutInflater.from(context);
        }

        ...         

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            final ViewHolder viewHolder;
            if (convertView == null) {
                LayoutInflater row = (LayoutInflater) this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = row.inflate(R.layout.image_new_row, null);

                viewHolder = new ViewHolder();
                viewHolder.mTitle = convertView.findViewById(R.id.txtNewsTitle);
                viewHolder.mImage = convertView.findViewById(R.id.imageNews);
                viewHolder.mDescription = convertView.findViewById(R.id.txtDescription);

                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }

            News news = newsList.get(position);
            viewHolder.mTitle.setText(news.getTitle());
            viewHolder.mDescription.setText(news.getDescription());
            if (news.getImageUrl() != null){
                ImageLoader.getInstance().displayImage(news.getImageUrl(), viewHolder.mImage);
            }
            else{
                viewHolder.mImage.setImageResource(R.drawable.loading);
            }

            return convertView;
        }
我的活动:

        public class NewsActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {

            private static final String ITEM = "item";
            private static final String TITLE = "title";
            private static final String LINK = "link";
            private static final String DESCRIPTION = "description";
            private static final String MEDIA = "media:content";
            private static final String IMAGE_URL = "url";

            private Feed feed;
            private ListView newsListView;
            private ArrayList<News> newsList;
            private NewsAdapter mAdapter;
            private ImageLoaderConfiguration imageLoaderConfiguration;

            @Override
            protected void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.activity_news);

                newsListView = (ListView) findViewById(R.id.newsList);

                this.feed = (Feed) getIntent().getSerializableExtra(Constants.EXTRA_CLICKED_FEED);

                configListView();
            }

            private void configListView() {
                File cacheDir = StorageUtils.getCacheDirectory(this);

                DisplayImageOptions defaultOptions = new DisplayImageOptions.Builder()
                        .showImageForEmptyUri(R.drawable.loading)
                        .showImageOnLoading(R.drawable.loading)
                        .showImageOnFail(R.drawable.loading).cacheInMemory(true).cacheOnDisk(true).build();
                imageLoaderConfiguration = new ImageLoaderConfiguration.Builder(this)
                        .defaultDisplayImageOptions(defaultOptions).build();
                ImageLoader.getInstance().init(imageLoaderConfiguration);

                newsList = new ArrayList<News>();
                mAdapter = new NewsAdapter(newsList, this);
                newsListView.setAdapter(mAdapter);

                newsListView.setOnItemClickListener(this);

                new RssAsyncTask().execute(
                        feed.getUrl());
            }

            private List<News> readXML(InputStream is) {
                List<News> newsList =
                        new ArrayList<News>();

                try {
                    DocumentBuilderFactory factory =
                            DocumentBuilderFactory.newInstance();

                    DocumentBuilder builder =
                            factory.newDocumentBuilder();
                    Document xmlDocument = builder.parse(is);

                    NodeList posts =
                            xmlDocument.getElementsByTagName(ITEM);

                    String title = null, description = null,
                            link = null, image = null;

                    for (int i = 0; i < posts.getLength(); i++) {
                        Node post = posts.item(i);

                        // Cada nó ITEM tem os filhos:
                        // TITLE, DESCRIPTION e LINK
                        NodeList postInfo = post.getChildNodes();

                        for (int j = 0; j < postInfo.getLength(); j++) {
                            Node info = postInfo.item(j);

                            if (TITLE.equals(info.getNodeName())) {
                                title = info.getTextContent();

                            } else if (LINK.equals(
                                    info.getNodeName())) {
                                link = info.getTextContent();

                            } else if (DESCRIPTION.equals(
                                    info.getNodeName())) {
                                description = extractText(info.getTextContent()).trim();
                            } else if (MEDIA.equals(
                                    info.getNodeName())) {
                                image = ((Element) info).getAttribute(IMAGE_URL);
                            }
                        }
                        newsList.add(
                                new News(title, description, link, image));
                    }
                } catch (Throwable e) {
                    e.printStackTrace();
                }
                return newsList;
            }


            class RssAsyncTask extends
                    AsyncTask<String, Void, List<News>> {

                ProgressDialog dialog;

                ...

                @Override
                protected void onPostExecute(List<News> result) {
                    super.onPostExecute(result);
                    dialog.dismiss();
                    newsList.addAll(result);
                    mAdapter.notifyDataSetChanged();
                }


            }
        }
公共类NewsActivity扩展AppCompativeActivity实现AdapterView.OnItemClickListener{
私有静态最终字符串ITEM=“ITEM”;
私有静态最终字符串TITLE=“TITLE”;
私有静态最终字符串LINK=“LINK”;
私有静态最终字符串DESCRIPTION=“DESCRIPTION”;
私有静态最终字符串MEDIA=“MEDIA:content”;
私有静态最终字符串IMAGE\u URL=“URL”;
私人饲料;
私有ListView新闻ListView;
私有ArrayList新闻列表;
私人新闻适配器;
私有ImageLoader配置ImageLoader配置;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_news);
newsListView=(ListView)findViewById(R.id.newsList);
this.feed=(feed)getIntent().getSerializableExtra(Constants.EXTRA_单击了_feed);
configListView();
}
私有void configListView(){
文件cacheDir=StorageUtils.getCacheDirectory(this);
DisplayImageOptions defaultOptions=新建DisplayImageOptions.Builder()
.showImageForEmptyUri(R.可牵引装载)
.showImageOnLoading(R.可绘制.加载)
.showImageOnFail(R.drawable.loading).cacheInMemory(true).cacheOnDisk(true).build();
imageLoaderConfiguration=新建imageLoaderConfiguration.Builder(此)
.defaultDisplayImageOptions(defaultOptions).build();
ImageLoader.getInstance().init(imageLoaderConfiguration);
newsList=newarraylist();
mAdapter=新的新闻适配器(新闻列表,此);
setAdapter(mAdapter);
setOnItemClickListener(这个);
新建RssAsyncTask()。执行(
feed.getUrl());
}
私有列表readXML(InputStream为){
列表新闻列表=
新的ArrayList();
试一试{
文档建设者工厂=
DocumentBuilderFactory.newInstance();
文档生成器=
factory.newDocumentBuilder();
Document xmlDocument=builder.parse(is);
节点列表帖子=
xmlDocument.getElementsByTagName(项目);
字符串title=null,description=null,
link=null,image=null;
对于(int i=0;i
obs:我正在使用通用映像加载api:
当然了。。。您正在重用上一个项目的布局。这就是下面这句话的意思

viewHolder = (ViewHolder) convertView.getTag();

如果您没有在
getView
方法中初始化它,它将显示与上一项相同的内容。

从您的代码中-当图像下载失败时,可能会发生这种情况。 您可以使用:

viewHolder.mImage.setImageResource(R.drawable.loading);        
if (news.getImageUrl() != null){
    ImageLoader.getInstance().displayImage(news.getImageUrl(), viewHolder.mImage);
}

您可以使用以下代码:

ImageLoader.getInstance().displayImage(imageUri, imageView, options, new ImageLoadingListener() {
    @Override
    public void onLoadingStarted(String imageUri, View view) {
    ...
    }
    @Override
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
        ...
    }
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        ...
    }
    @Override
    public void onLoadingCancelled(String imageUri, View view) {
        ...
    }
}
});

将变量初始化放入for循环中,如下所示,这样每次它都会将变量重新初始化为null

                for (int i = 0; i < posts.getLength(); i++) {

                       String title = null, description = null,
                        link = null, image = null;

                    Node post = posts.item(i);

                    // Cada nó ITEM tem os filhos:
                    // TITLE, DESCRIPTION e LINK
                    NodeList postInfo = post.getChildNodes();

                    for (int j = 0; j < postInfo.getLength(); j++) {
                        Node info = postInfo.item(j);

                        if (TITLE.equals(info.getNodeName())) {
                            title = info.getTextContent();

                        } else if (LINK.equals(
                                info.getNodeName())) {
                            link = info.getTextContent();

                        } else if (DESCRIPTION.equals(
                                info.getNodeName())) {
                            description = extractText(info.getTextContent()).trim();
                        } else if (MEDIA.equals(
                                info.getNodeName())) {
                            image = ((Element) info).getAttribute(IMAGE_URL);
                        }
                    }
                    newsList.add(
                            new News(title, description, link, image));
                }
for(int i=0;i                for (int i = 0; i < posts.getLength(); i++) {

                       String title = null, description = null,
                        link = null, image = null;

                    Node post = posts.item(i);

                    // Cada nó ITEM tem os filhos:
                    // TITLE, DESCRIPTION e LINK
                    NodeList postInfo = post.getChildNodes();

                    for (int j = 0; j < postInfo.getLength(); j++) {
                        Node info = postInfo.item(j);

                        if (TITLE.equals(info.getNodeName())) {
                            title = info.getTextContent();

                        } else if (LINK.equals(
                                info.getNodeName())) {
                            link = info.getTextContent();

                        } else if (DESCRIPTION.equals(
                                info.getNodeName())) {
                            description = extractText(info.getTextContent()).trim();
                        } else if (MEDIA.equals(
                                info.getNodeName())) {
                            image = ((Element) info).getAttribute(IMAGE_URL);
                        }
                    }
                    newsList.add(
                            new News(title, description, link, image));
                }