gpt4 book ai didi

android - 单击图像时如何更改 ListView 中的图像?

转载 作者:行者123 更新时间:2023-11-29 15:43:44 25 4
gpt4 key购买 nike

编辑:我已经解决了这个问题,如果有兴趣,请看看我的回答,看看我是怎么做到的!

我目前在 Android Studio 工作。我有一个 ListView,其中填充了多个项目。在这些项目中的每一项中都有一个 ImageButton,其图像带有“+”。我想要做的是,每当单击该图像时(不是整个 ListView 项目,只是图像),我希望“+”的图像成为另一个图像。我们将不胜感激,因为这一直是一个持续存在的问题!

这是我尝试使用的当前代码:

final ImageButton movieSeen = (ImageButton convertView.findViewById(R.id.movieWatched);
movieSeen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
movieSeen.setImageResource(R.drawable.ic_check_circle_black_24dp);
}
});

目前这确实会更新我正确点击的图像,但它也会更新尚未在屏幕上呈现的图像,因此当我向下滚动 ListView 时,其他对象也会更改为 ic_check_circle_black_24dp。

我想要的很简单,只是不知道如何实现。我只想单击一个 ImageButton,它位于 ListView 的一个项目内,并让该 ImageButton 更改其图像资源。

这是我根据要求定制的数组适配器!

private class MovieScrollAdapter extends ArrayAdapter<Movie> {//custom array adapter
private Context context;
private List<Movie> movies;

public MovieScrollAdapter(Context context, List<Movie> movies){
super(context, -1, movies);
this.context = context;
this.movies = movies;

if(this.movies.isEmpty()){//if no results were returned after all processing, display a toast letting the user know
Toast.makeText(getApplicationContext(), R.string.no_matches, Toast.LENGTH_SHORT).show();
}
}

@Override
public View getView(final int position, View convertView, ViewGroup parent){
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = inflater.inflate(R.layout.movie_layout, parent, false);
}

TextView title = (TextView) convertView.findViewById(R.id.title);
title.setText(movies.get(position).getTitle());

TextView plot = (TextView) convertView.findViewById(R.id.plot);
plot.setText(movies.get(position).getPlot());

TextView genre = (TextView) convertView.findViewById(R.id.genre);
genre.setText(movies.get(position).getGenre());


TextView metaScore = (TextView) convertView.findViewById(R.id.metascore);

if(movies.get(position).getMetaScore() == -1){//if the metaScore is set to -1, that means movie has not been rated, which by inference means it is not yet released
metaScore.setText(R.string.movie_not_released);
metaScore.setTextSize(TypedValue.COMPLEX_UNIT_SP, 9.5f);//smaller text so it fits without breaking anything
metaScore.setTextColor(getColor(R.color.colorAccent));
} else {
metaScore.setText(" " + Integer.valueOf(movies.get(position).getMetaScore()).toString() + " ");//using white space for minor formatting, instead of altering margins each time this is rendered
metaScore.setTextSize(TypedValue.COMPLEX_UNIT_SP, 25);

//setting up a "highlighted" background to achieve metacritic square effect
Spannable spanText = Spannable.Factory.getInstance().newSpannable(metaScore.getText());
spanText.setSpan(new BackgroundColorSpan(getColor(R.color.metaScore)), 3, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
metaScore.setText(spanText);
metaScore.setTextColor(getColor(android.R.color.primary_text_dark));

}

ImageView image = (ImageView) convertView.findViewById(R.id.imageView);
new ImageDownloadTask((ImageView)image).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, movies.get(position).getPosterURL());//because there are several images to load here, we let these threads run parallel

title.setOnClickListener(new View.OnClickListener() {//setting up a simple onClickListener that will open a link leading to more info about the movie in question!
@Override
public void onClick(View v) {
Uri uri = Uri.parse(movies.get(position).getMovieURL());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
}
});

final ImageButton movieSeen = (ImageButton) convertView.findViewById(R.id.movieWatched);
movieSeen.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
movieSeen.setImageResource(R.drawable.ic_check_circle_black_24dp);
}
});




return convertView;
}

}

最佳答案

问题出在 ListView 上, View 被重用以节省内存并避免创建大量 View ,因此当您更改 View 时,它会在被重用以显示另一个项目时保持状态。

例如,您有 100 个元素,您触摸第一个元素 ImageButton 并且该按钮被更改。可能在屏幕上显示了列表的 5 个元素,而您更改了第一个。但是,如果您滚动到元素编号 15,系统不会创建 15 个 View ,而是获取您之前单击的第一个 View 并更改内容。因此,您希望有一个带有“+”ImageButton 图标的 View ,但您看到了另一个图标,这是因为您必须将 View 状态保存在模型对象中并在每次调用“getView”时设置状态。

发布您的列表适配器以查看其实现方式。

更新:现在我看到了你的适配器实现,我建议你在 Movie 类中添加一个 int 字段来保存你想要在 ImageButton 上显示的资源 ID。然后在 onClickListener 中,您必须为此字段设置您希望在单击时在 View 上显示的资源,并调用 notifyDataSetChanged()。之后你必须在 getView() 里面做:

movieSeen.setImageResource(movies.get(position).getButtonImageResource());

关于android - 单击图像时如何更改 ListView 中的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36355333/

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