Android ListView重复图像
我正在android上实现一个包含imageview的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
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));
}