java - 调用notifyItemChanged后,适配器不会收到通知,并且onBindViewHolder不会被调用

标签 java android android-recyclerview

当我尝试更新适配器的单个项目时,我正在使用RecyclerView.Adapter。调用 notifyItemChanged。它不会做出任何改变。我附上代码。

我正在使用一个组件来显示一堆任务,并且在一定比例的滑动中,我需要显示一个已批准的图标,在布局顶部被拒绝,我设法捕获它,但在更新项目回收器时不会更新它。

fragment :

public class PushMissionsFragment extends BoostFragment implements PushMissionsAdapter.MissionCardListener, FavouriteListener {

@Inject
Navigator navigator;

@Inject
UserViewModel userViewModel;

@Inject
FinalUserViewModel finalUserViewModel;

@Inject
MissionViewModel missionViewModel;

@Inject
MissionRepository missionRepository;

@BindView(R.id.stack)
SwipeStack stack;

private PushMissionsAdapter adapter;

private Location myLocation;

private final FavouriteListener favouriteListener = this;

public static PushMissionsFragment newInstance(){
    return new PushMissionsFragment();
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    GPSTracker gpsTracker = new GPSTracker(getContext(),getBoostActivity());
    myLocation = gpsTracker.getLocation();
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View view = super.onCreateView(inflater,container,savedInstanceState);

    adapter = new PushMissionsAdapter(getContext(), myLocation, this);

    final AdapterConverter<PushMissionsAdapter, PushMissionsAdapter.ViewHolder, Mission> adapterPRO = new AdapterConverter<>(getContext(), adapter);

    finalUserViewModel.getFinalUser(userViewModel.getUserId()).observe(this, new Observer<FinalUser>() {
        @Override
        public void onChanged(@Nullable FinalUser finalUser) {
            if (finalUser != null){
                adapter.setList(finalUser.getAvailableMissions());
                adapter.notifyDataSetChanged();
                stack.setAdapter(adapterPRO);
            }
        }
    });

    stack.setSwipeProgressListener(new SwipeStack.SwipeProgressListener() {
        @Override
        public void onSwipeStart(int position) {

        }

        @Override
        public void onSwipeProgress(int position, float progress) {
            Log.d("PROGRESS", String.valueOf(progress));

            if (progress >= 0.5f){

                final Mission mission = adapter.getItemAt(position);

                mission.setAccepted(1);
                adapter.getList().set(position, mission);
                adapter.notifyItemChanged(adapter.getList().indexOf(mission));

            } else {

            }
        }

        @Override
        public void onSwipeEnd(int position) {

        }
    });
    stack.setListener(new SwipeStack.SwipeStackListener() {
        @Override
        public void onViewSwipedToLeft(int position) {
            if (adapter.getList() == null || adapter.getList().size() == 0)
                return;
            adapter.getList().remove(position == 0 ? 0 : adapter.getList().size() - position);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onViewSwipedToRight(int position) {
            if (adapter.getList() == null || adapter.getList().size() == 0)
                return;
            String missionId = adapter.getItemAt(0).get_id();
            missionRepository.saveFavouriteMission(missionId, favouriteListener);
            adapter.getList().remove(position == 0 ? 0 : adapter.getList().size() - position);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onStackEmpty() {

        }
    });
    return view;
}

@OnClick(R.id.accept)
public void accept(){
    stack.onViewSwipedToRight();
}

@OnClick(R.id.cancel)
public void cancel(){
    stack.onViewSwipedToLeft();
}


@Override
protected int getViewId() {
    return R.layout.fragment_push_missions;
}

@Override
protected void injectDependencies(BoostComponents boostComponents) {
    boostComponents.inject(this);
}

@Override
public void onMissionClick(Mission mission) {
    if (mission.getCategory() == Mission.category.presential){
        if (mission.getContactPoints().size()==1){
            navigator.showFirstMissionStartActivity(this, mission, mission.getContactPoints().get(0).get_id());
        }else {
            navigator.showMissionPDVsActivity(this, mission.get_id());
        }
    } else if (mission.getCategory() == Mission.category.prediction){
        navigator.showFindMissionFormPredictiveActivity(getBoostActivity(), mission.get_id());
    }
}

@Override
public void onFavouriteSaved() {
    SyncroManager.setUploadScheduler(getContext(), userViewModel.getUserId());
}}

适配器:

public class PushMissionsAdapter extends AdapterConverter.Adapter<PushMissionsAdapter.ViewHolder, Mission>{

private final Context context;

private final Location myLocation;

private MissionCardListener mListener;

private final List<Mission> list = new ArrayList<>();

public PushMissionsAdapter(Context context, Location myLocation, MissionCardListener mListener){
    this.context = context;
    this.myLocation = myLocation;
    this.mListener = mListener;
}

public List<Mission> getList() {
    return list;
}

public void setList(@NonNull final List<Mission> missionList){
   this.list.clear();
   this.list.addAll(missionList);
}

public Context getContext() {
    return context;
}

@Override
public Mission getItemAt(int position) {
    return list.get(position);
}

@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_push_missions, parent, false);
    return new ViewHolder(v, mListener);
}

@Override
public int getItemCount() {
    if (list == null)
        return 0;
    return list.size();
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
    Mission mission = list.get(position);

    holder.mission = mission;

    Glide.with(context).load(mission.getCardImageUrl()).into(holder.imagen);

    if (mission.getAccepted() == 1){
        holder.card_accepted.setVisibility(View.VISIBLE);
    } else {
        holder.card_accepted.setVisibility(View.GONE);
    }

    if (mission.getCanceled() == 1){
        holder.card_canceled.setVisibility(View.VISIBLE);
    } else {
        holder.card_canceled.setVisibility(View.GONE);
    }

    holder.marca.setText(mission.getBrand().getName());
    holder.donde.setText(mission.getPlace().toString());
    holder.descripcion.setText(mission.getDescription());
    holder.puntos.setText(Integer.valueOf(mission.getPoints().intValue()) + " PTS");

    if (!mission.getCategory().toString().equals("presential")) {
        holder.linear.setVisibility(View.GONE);
        holder.imagen.setVisibility(View.GONE);
        holder.relative_predictive.setVisibility(View.VISIBLE);
        holder.linear_predictive.setVisibility(View.VISIBLE);
    } else {
        holder.linear.setVisibility(View.VISIBLE);
        holder.imagen.setVisibility(View.VISIBLE);
        holder.relative_predictive.setVisibility(View.GONE);
        holder.linear_predictive.setVisibility(View.GONE);
        Location mLocation = new Location("pdv");
        mLocation.setLatitude(mission.getContactPoints().get(0).getLatitude());
        mLocation.setLongitude(mission.getContactPoints().get(0).getLongitude());
        float distanceInMeters = myLocation != null ? myLocation.distanceTo(mLocation) : 0f;
        holder.distancia.setText("A " + (distanceInMeters == 0f ? "undefined" : Math.round(distanceInMeters)) + " Mts");
    }
}

public static class ViewHolder extends AdapterConverter.ViewHolder {

    private MissionCardListener cardListener;

    Mission mission;

    @BindView(R.id.imagenMision)
    ImageView imagen;

    @BindView(R.id.image_accept_card)
    ImageView card_accepted;

    @BindView(R.id.image_cancel_card)
    ImageView card_canceled;

    @BindView(R.id.marca)
    TextView marca;

    @BindView(R.id.donde)
    TextView donde;

    @BindView(R.id.descripcion)
    TextView descripcion;

    @BindView(R.id.puntos)
    TextView puntos;

    @BindView(R.id.linear)
    LinearLayout linear;

    @BindView(R.id.relative_predictive)
    RelativeLayout relative_predictive;

    @BindView(R.id.linear_predictive)
    LinearLayout linear_predictive;

    @BindView(R.id.distancia)
    TextView distancia;

    ViewHolder(View itemView, final MissionCardListener cardListener){
        super(itemView);
        this.cardListener = cardListener;
        ButterKnife.bind(this, itemView);
    }

    @OnClick(R.id.relative_predictive)
    public void onClickPredictive(){
        cardListener.onMissionClick(mission);
    }

    @OnClick(R.id.imagenMision)
    public void onClickPresential(){
        cardListener.onMissionClick(mission);
    }
}

public interface MissionCardListener{
    void onMissionClick(Mission mission);
}

}

最佳答案

只需调用

adapter.notifyItemChanged(position) 

而不是

adapter.notifyItemChanged(adapter.getList().indexOf(mission));

关于java - 调用notifyItemChanged后,适配器不会收到通知,并且onBindViewHolder不会被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51102133/

相关文章:

android - 我们如何在不更改 TextView 和布局的情况下更改问题和选项

android-recyclerview - 如何使用另一个 Room-DAO 查询刷新我的 RecyclerView

java - 使用 OutputStreamWriter 写入 : line by line vs all at once

java - 字符串中的唯一字节

android - 如何在电话管理器中查找拨出号码

java - 在 Android 屏幕的上半部分显示谷歌地图

android - 添加滑动以刷新动态列表的布局

android - 带有工具栏的 NestedScrollView

Java - 当你将一个添加到列表中的最大值时如何去第一个项目?

java - 在打开时更新 JPopupMenu 菜单项