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() 中的视图。