如何从bindViewHolder更改适配器项资源

时间:2016-02-20 09:02:36

标签: android adapter android-recyclerview recycler-adapter android-viewholder

我一直困在代码中,我想更改活动项目的适配器项目图像源。我已经设置好了,仍然获得活动项目位置并从服务中调用该方法。

我有sendBroadcast方法用一些数据发送意图并在保存RecyclerView的片段中接收它。

从那里onReceive()方法我调用适配器方法。问题来了。在适配器中,它一直运行良好,直到记录。

问题是该项目需要持有人才能更改,例如

holder.imageview.setBackgroundResource(...);

但即使在notifyDatasetChanged();之后它仍无法正常工作,请帮助我们, 下面是我的代码。 这些是在需要时调用的服务方法:

 public void sendPlayBroadcast() {
    controlIntent.putExtra("control", "1");
    sendBroadcast(controlIntent);
    Log.e("sending broadcast","TRUE");
}

public void sendPauseBroadcast() {
    controlIntent.putExtra("control", "0");
    sendBroadcast(controlIntent);
    Log.e("sending broadcast","TRUE");
}

这是片段,我收到广播和调用适配器方法:

BroadcastReceiver controlBR = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        sendControls(intent);
    }
};

private void sendControls(Intent cIntent) {
    String controls = cIntent.getExtras().getString("control");
    int control = Integer.parseInt(controls);
    switch (control) {
        case 1:
            mAdapter.Play_the_Icon();
            mAdapter.notifyDataSetChanged();
            Log.e("received broadcast","TRUE");
            break;
        case 0:
            mAdapter.Pause_the_Icon();
            mAdapter.notifyDataSetChanged();
            Log.e("received broadcast","TRUE");
            break;
    }
}

这些是RecyclerView适配器:

 public void Pause_the_Icon() {
    imageView.setImageResource(R.drawable.ic_play_arrow_24dp);
    Log.d("all good till here", "TRUE");
}

public void Play_the_Icon() {
    imageView.setImageResource(R.drawable.ic_equalizer_24dp);
    Log.d("all good till here", "TRUE");
}

1 个答案:

答案 0 :(得分:1)

您需要使用onBindViewHolder()方法更新图片资源,否则您的更改将会丢失。

这是我的建议:

1)在适配器中创建一个int变量以引用资源文件。

private int mImgResource;

2)使用默认值在适配器构造函数中初始化变量,例如:

mImgResource = R.drawable.ic_equalizer_24dp;

3)将您的Pause_the_Icon()Play_the_Icon()方法更改为:

public void Pause_the_Icon() {
    mImgResource = R.drawable.ic_play_arrow_24dp;
    Log.d("all good till here", "TRUE");
}

public void Play_the_Icon() {
    mImgResource =R.drawable.ic_equalizer_24dp;
    Log.d("all good till here", "TRUE");
}

4)在onBindViewHolder()方法中,执行:

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    holder.imageview.setBackgroundResource(mImgResource);
}