- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
当我尝试更新适配器的单个项目时,我正在使用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/
我知道这可能是一个愚蠢的问题,但我找不到答案。我请求你的帮助。 我有一个使用 LinearLayoutManager 的 RecyclerView 和一个自定义 RecyclerView.Adapte
我正在使用后台服务下载一些文件并更新 RecyclerView 中的进度。当进度更改时,服务将使用回调到 Activity ,其中项目随进度更改。我想知道哪一个在性能方面更好? 所以我必须像这样使用
我有一个 ImageView,其中使用 Glide 加载图像。当我执行了 like 操作后,使用 notifyItemChanged(position) 通知回收器 View 适配器。它会导致图像闪烁
当我在我的 RecyclerView 上调用 notifyItemChanged() 时,相应的 Views(在本例中为按钮)没有按预期更新.我调用他们的原因是数据已经改变,这会导致他们的背景颜色改变
首先,我为此工作了一整天,但一事无成。我有一个 RecyclerView 和一个使用 RecyclerView 的 SortedList 的适配器。我尝试使用回调类实现 TouchHelper: pu
为了在我从详细信息 Activity 返回时从最后选择的 RecyclerView 项目中删除突出显示的背景颜色,我在 onResume() 中尝试了这个: mAdapter.notifyItemCh
RecyclerView 调用 notifyItemChanged() 导致空白条目 我有一个 RecyclerView 并且它的每个子项都有一个 RecyclerView,当子项中的 Recycle
根据documentation在 RecyclerView.Adapter 中,您可以通知某个项目已更改并传入一个“可选负载对象”,该对象随后将被合并并传递给 onBindViewHolder允许更精
我有一个带有显示服务器列表的适配器的 RecycleView并且用户必须选择一个服务器。 当我在 onClick() 方法中调用 notifyItemChanged(previousPosition)
我有一个数据集,它可能会在刷新时发生变化。很难确定现有数据集中的哪些条目已更改。我通读了 recyclerview 适配器说明,我的主要问题是。 确定更改了哪个数据 View ,然后对受影响的范围使用
我有一个使用 LinearLayoutManager 的 RecyclerView 和一个自定义 RecyclerView.Adapter。当用户长按某个项目时,它会触发仅该项目的异步网络刷新。我知道
我正在将 ViewPager2 与 FragmentStateAdapter 一起使用,并且我正在调用 notifyItemChanged(position)。但正如预期的那样,createFragm
编辑 我在 Github 上创建了一个演示项目来展示确切的问题。 Git Project . 我在 Kotlin 中编写了一个可扩展的 recyclerView 每行都有一个使用 TextToSpee
如题。我正在编写一个支持多选模式的自定义 RecyclerView。我需要跟踪每个项目的选中/未选中状态。所以在 recyclerView 的数据大小发生变化之后。我想更新我的跟踪状态列表的大小。但我
我的代码如下所示: public class PopularItemsAdapter extends RecyclerView.Adapter implements MyCartLis
我在 AdapterActivity 中有一个 RecyclerView。单击其任何项目后,我使用 AlertDialogShow#UpdateStudent() 方法更新该项目。我的问题是我无法使用
有什么方法可以在项目更改时从回收 View 中禁用 CardView 提升动画,但保留原始阴影和项目动画师? 我试图禁用 CardView 状态动画器 android:stateListAnimato
所以我有一个 Activity RecyclerView我想改变TextView RecyclerView 中的每一项通过按下具有 onClickListener() 的按钮在 Activity 中。
我正在尝试更新 ViewHolder 中的 RecyclerView 而不重新绑定(bind)整个内容。根据文档,我应该通过调用 RecyclerView.Adapter.notifyItemChan
所以我有一个 RecyclerView,在我拉入其中的每个 xml 中都有一个复选框,当按下该复选框时,该复选框会从 RecyclerView 中删除该特定项目。至少那是我试图做的。据我了解,要使其正
我是一名优秀的程序员,十分优秀!