Android:适配器中的 setImageResource 稍后更改图像 3 个位置
Android: setImageResource in adapter changing image 3 positions later
我正在使用 AndroidSwipeableCardStack 做一个类似火种的界面,带有 5 星评级系统。当我单击用于更改图像的按钮时。图像更改后三张卡不在当前卡中。
这是我使用的项目:https://github.com/wenchaojiang/AndroidSwipeableCardStack
我想这与预加载下一张卡片有关,因为 recyclerview 通常会这样做,但我真的不确定。
下面是我的适配器,您可以在底部看到我在 clicklistner 上的一星级图像按钮上调用了 setimageresource。我设置了一个 Log.d 并且按钮点击在点击后立即注册但是图像资源中的更改仅在刷了 3 张卡片后才会出现。
编辑:所以我注意到,无论我导入的是什么项目,我的适配器都只扩展了 ArrayAdatper。所以我猜想问题可能出在 getView 方法中,我可能需要覆盖其他东西(不确定)。但重要的一点是,我通过记录位置检查了 getView 中的位置,果然它说的是位置 0、1、2、3,没有任何东西被擦掉。这类似于 setImageResource 的偏移量,所以我相信它们是相互关联的,但不幸的是,这并没有让我更接近答案。
感谢您的帮助。
public class SongPreviewCardsDataAdapter extends ArrayAdapter<SongDatabaseMappingAdapter> {
public SongPreviewCardsDataAdapter(Context context, int resource) {
super(context, resource);
}
ImageButton oneStarRating;
@Override
public View getView(int position, final View contentView, ViewGroup parent) {
// Initialise Song Views
SongDatabaseMappingAdapter item = getItem(position);
TextView songName = (TextView) (contentView.findViewById(R.id.songNameTextView));
songName.setText(item.getSongTitle());
com.mikhaellopez.circularimageview.CircularImageView songImage = (CircularImageView) contentView.findViewById(R.id.songImageView);
String ImageURL = (item.getPictureURL());
Picasso
.with(this.getContext())
.load(ImageURL)
.into(songImage);
// Initialise Rating Buttons
oneStarRating = (ImageButton) contentView.findViewById(R.id.ratingButton1);
// Create OnClickListners for Ratings Buttons
oneStarRating.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
oneStarRating.setImageResource(R.drawable.starfull);
Log.d("Star", "Star Clicked");
}
});
return contentView;
}
}
getView
可以随时在任何项目上调用,因此如果您希望某些内容在视图上保持设置,则必须对其建模。
我不知道你的 SongDatabaseMappingAdapter
class 是否可以更改,但我假设你可以更改它。
为您的项目添加一个变量 class,例如 boolean mOneStar
。 Getter/setter 留作 reader.
的练习
在 getView()
中创建您的项目 final
以便您可以在 onClick
回调中引用它:
final SongDatabaseMappingAdapter item = getItem(position);
使用 getView
中的变量设置您的视图:
oneStarRating = (ImageButton) contentView.findViewById(R.id.ratingButton1);
oneStarRating.setImageDrawable(null); // clear out recycled value
if (item.isOneStar()) {
oneStarRating.setImageResource(R.drawable.starfull);
}
在您的 OnClickListener
中,在项目上设置 属性 并调用 notifyDataSetChanged()
:
oneStarRating.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.d("Star", "Star Clicked");
item.setOneStar(true);
notifyDataSetChanged();
}
});
要点是:永远不要从事件处理程序更改视图。始终从事件处理程序更改项目,然后调用 adapter.notifyDataSetChanged()
,并始终根据项目更改 getView()
中的视图。
我正在使用 AndroidSwipeableCardStack 做一个类似火种的界面,带有 5 星评级系统。当我单击用于更改图像的按钮时。图像更改后三张卡不在当前卡中。
这是我使用的项目:https://github.com/wenchaojiang/AndroidSwipeableCardStack
我想这与预加载下一张卡片有关,因为 recyclerview 通常会这样做,但我真的不确定。
下面是我的适配器,您可以在底部看到我在 clicklistner 上的一星级图像按钮上调用了 setimageresource。我设置了一个 Log.d 并且按钮点击在点击后立即注册但是图像资源中的更改仅在刷了 3 张卡片后才会出现。
编辑:所以我注意到,无论我导入的是什么项目,我的适配器都只扩展了 ArrayAdatper。所以我猜想问题可能出在 getView 方法中,我可能需要覆盖其他东西(不确定)。但重要的一点是,我通过记录位置检查了 getView 中的位置,果然它说的是位置 0、1、2、3,没有任何东西被擦掉。这类似于 setImageResource 的偏移量,所以我相信它们是相互关联的,但不幸的是,这并没有让我更接近答案。
感谢您的帮助。
public class SongPreviewCardsDataAdapter extends ArrayAdapter<SongDatabaseMappingAdapter> {
public SongPreviewCardsDataAdapter(Context context, int resource) {
super(context, resource);
}
ImageButton oneStarRating;
@Override
public View getView(int position, final View contentView, ViewGroup parent) {
// Initialise Song Views
SongDatabaseMappingAdapter item = getItem(position);
TextView songName = (TextView) (contentView.findViewById(R.id.songNameTextView));
songName.setText(item.getSongTitle());
com.mikhaellopez.circularimageview.CircularImageView songImage = (CircularImageView) contentView.findViewById(R.id.songImageView);
String ImageURL = (item.getPictureURL());
Picasso
.with(this.getContext())
.load(ImageURL)
.into(songImage);
// Initialise Rating Buttons
oneStarRating = (ImageButton) contentView.findViewById(R.id.ratingButton1);
// Create OnClickListners for Ratings Buttons
oneStarRating.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
oneStarRating.setImageResource(R.drawable.starfull);
Log.d("Star", "Star Clicked");
}
});
return contentView;
}
}
getView
可以随时在任何项目上调用,因此如果您希望某些内容在视图上保持设置,则必须对其建模。
我不知道你的 SongDatabaseMappingAdapter
class 是否可以更改,但我假设你可以更改它。
为您的项目添加一个变量 class,例如
boolean mOneStar
。 Getter/setter 留作 reader. 的练习
在
getView()
中创建您的项目final
以便您可以在onClick
回调中引用它:final SongDatabaseMappingAdapter item = getItem(position);
使用
getView
中的变量设置您的视图:oneStarRating = (ImageButton) contentView.findViewById(R.id.ratingButton1); oneStarRating.setImageDrawable(null); // clear out recycled value if (item.isOneStar()) { oneStarRating.setImageResource(R.drawable.starfull); }
在您的
OnClickListener
中,在项目上设置 属性 并调用notifyDataSetChanged()
:oneStarRating.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Log.d("Star", "Star Clicked"); item.setOneStar(true); notifyDataSetChanged(); } });
要点是:永远不要从事件处理程序更改视图。始终从事件处理程序更改项目,然后调用 adapter.notifyDataSetChanged()
,并始终根据项目更改 getView()
中的视图。