Bri*_*som 11 android recycler-adapter android-recyclerview
[第一次提问者和第一次安卓编码器所以我道歉,如果我做错了什么]
我正在尝试更改我的回收器上的itemview内部的值.但是,如果该项目视图恰好在屏幕外,则findViewBy [布局,适配器或ID]将显示为null.
public void setUserActive(UserListAdapter adapter, RecyclerView recyclerView, int position, View v) {recyclerView.findViewHolderForItemId(adapter.getItemId(position));
TextView txtActive = (TextView) vh.itemView.findViewById(R.id.user_isActive);
txtActive.setText("Active");
UserListAdapter.ViewHolder inactivevh = (UserListAdapter.ViewHolder) recyclerView.findViewHolderForItemId(adapter.getItemId(adapter.getActiveUserPosition()));
TextView txtInActive = (TextView) inactivevh.itemView.findViewById(R.id.user_isActive);
txtInActive.setText("");
adapter.setActiveUserPosition(position);
}
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同的方法,从使用
UserListAdapter.ViewHolder vh = (UserListAdapter.ViewHolder) recyclerView.findViewHolderForLayoutPosition(position);
Run Code Online (Sandbox Code Playgroud)
要么
UserListAdapter.ViewHolder inactivevh = (UserListAdapter.ViewHolder) recyclerView.findViewHolderForAdapterPosition(position)
Run Code Online (Sandbox Code Playgroud)
当应该处于inactivevh的视图关闭时,它们都会失败.
我已将适配器设置为hasStableIDs = true notifydatasetchanged似乎也没有帮助.
如果某个项目在屏幕上(布局),您可以使用您描述的方法方便地获取其视图持有者.如果一个项目不在屏幕上,它将在通过滚动后立即更新onBindViewHolder.如果没有滚动,则不会向用户显示任何更新它的尝试是浪费处理能力(除了因为项目没有分配视图持有者而无法实现).
含义:以onBindViewHolder能够提取最新数据的方式实现适配器.看起来你已经全部设置好了,可以使用这个:
public void setUserActive(UserListAdapter adapter, RecyclerView recyclerView, int position) {
// Retrieve the old active user ID so we can mark him deactivated.
final int oldUserActivePosition = adapter.getActiveUserPosition();
// Setup the adapter with current data.
adapter.setActiveUserPosition(position);
// Do NOT use stable IDs and this method. It just doesn't work as expected.
// recyclerView.findViewHolderForItemId(adapter.getItemId(position));
// Activate new user.
UserListAdapter.ViewHolder holder = (UserListAdapter.ViewHolder) recyclerView.findViewHolderForAdapterPosition(position);
if (holder == null) {
// The item is off screen, no need to update it yet.
} else {
// Update the on screen item. The logic is already implemented in the adapter.
adapter.onBindViewHolder(holder, position);
}
// Deactivate previous user.
holder = (UserListAdapter.ViewHolder) recyclerView.findViewHolderForAdapterPosition(oldUserActivePosition);
if (holder != null) {
adapter.onBindViewHolder(holder, oldUserActivePosition);
}
}
Run Code Online (Sandbox Code Playgroud)
当然,简化代码中的if-else块.
我刚刚意识到原始解决方案是多么复杂.只要适配器可以对您需要的所有事件做出反应,onBindViewHolder并且绑定非常简单,这就足够了:
public void setActiveUserPosition(int position) {
if (mActiveUserPosition != position) {
int oldPosition = mActiveUserPosition;
mActiveUserPosition = position;
notifyItemChanged(oldPosition);
notifyItemChanged(position);
}
}
Run Code Online (Sandbox Code Playgroud)
您现在需要调用的只是adapter.setActiveUserPosition(position);渲染setUserActive方法已过时.
| 归档时间: |
|
| 查看次数: |
7286 次 |
| 最近记录: |