用户按下按钮时如何从适配器更改图像?

时间:2016-01-26 05:55:22

标签: android custom-adapter

我有一个适配器,点击就在这个适配器里面,如下所示:

  @Override
public void onBindViewHolder(final ViewHolder holder, int position) {


    final Movie currentMovie = movieList.get(position);

    holder.textView.setText(currentMovie.getMovieName());

    try {
        UrlImageViewHelper.setUrlDrawable(holder.imageView, currentMovie.getMoviePictureLinkString(), R.drawable.placeholder_logo);
    } catch (Exception e) {
        holder.imageView.setImageDrawable(context.getResources().getDrawable(R.drawable.placeholder_logo));
    }


    try {
        if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BOUGHT) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_upgrade));

        } else if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BUY) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_buy));

        } else if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_DEFAULT) {
            holder.tagImage.setBackgroundResource(0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }


    holder.v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_DEFAULT) {

                LinkConfig
                        .loadMovieLink(context, currentMovie);

            } else if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BOUGHT) {

                LinkConfig
                        .loadMovieLink(context, currentMovie);


                /*if (loginType == Util.LOGIN_TYPE_ACCOUNT) {
                    LinkConfig
                            .loadMovieLink(context, currentMovie);

                } else {
                    showDialogForFreeUser();

                }*/


            } else {

                MultipleUsedMethods.showBuyDialog(
                        context, currentMovie);

               /* if (loginType == Util.LOGIN_TYPE_ACCOUNT) {
                    MultipleUsedMethods.showBuyDialog(
                            context, currentMovie);
                } else {
                    showDialogForFreeUser();

                }*/


            }

        }
    });



}

现在,当我点击anyitem时,它会通过不同的方法,并且在某个方法中的一个成功条件之后,我必须更改适配器中的标记以适应这种情况:

  try {
        if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BOUGHT) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_upgrade));

        } else if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_BUY) {
            holder.tagImage.setBackground(context.getResources().getDrawable(R.drawable.tag_buy));

        } else if (currentMovie.getMoviePurchaseDetail() == Movie.PURCHASE_DEFAULT) {
            holder.tagImage.setBackgroundResource(0);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }

如何从其他方法更改适配器的tagImage?有什么想法吗?

1 个答案:

答案 0 :(得分:1)

你可以在你的适配器中有一个回调,所以你可以绑定它,就像这样说你的活动(我从我的C#代码翻译过来,所以看起来有点奇怪,但你明白了):

// call this from activity
// Put your logic/conditions here. Then update the adapter with the given position
adapter.setOnItemClickListener(someCallback);

回调界面

interface ICallback{
    void onItemClick(int position);
}

在适配器中

public void setOnItemClickListener(ICallback callback){
  this.callback = callback
}

@Override
public void onCreateViewHolder (ViewGroup parent, int viewType)
    {
        View itemView =  // inflate your layout here
        var vh = new ImageViewHolder (itemView, this.callback);
        return vh;
    }

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {

   final SomeClass item = yourList.get(position);

   holder.view.setText(item.getYourData());
   // Don't put any logic in this function
   // only set your data to view here

你的持有人课程:

public class ImageViewHolder extends RecyclerView.ViewHolder
{
    public ImageView image;

    public ImageViewHolder (View itemView, ICallback callback) : base (itemView)
    {
        v = (View)itemView.findViewById(Resource.Id.image);
        v.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if(callback != null)
                callback.onItemClick(super.position)
        });
    }
}

您在适配器中具有单击项的位置,您可以轻松地在适配器中编辑其值。您不应该在适配器的onBindViewHolder中添加任何逻辑。相反,可能在您的活动中执行逻辑,然后将新数据设置到适配器,并通知更改。