【发布时间】:2023-03-26 23:51:02
【问题描述】:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
RecyclerView list = (RecyclerView) findViewById(R.id.list);
list.setLayoutManager(new LinearLayoutManager(this));
final RecyclerView.Adapter adapter = getAdapter();
list.setAdapter(adapter);
adapter.notifyItemChanged(1, new Object());//this doesn't work
list.post(new Runnable() {
@Override
public void run() {
adapter.notifyItemChanged(1, new Object());//this works
}
});
}
@NonNull
private RecyclerView.Adapter getAdapter() {
return new RecyclerView.Adapter() {
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new ItemViewHolder( LayoutInflater.from(parent.getContext())
.inflate(R.layout.list_view_item, parent, false));
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
ItemViewHolder item = (ItemViewHolder) holder;
item.tv.setText("test");
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position, List payloads) {
if(payloads.isEmpty())
onBindViewHolder(holder, position);
else{
ItemViewHolder item = (ItemViewHolder) holder;
item.tv.setText("changed!!!!!! ");
}
}
@Override
public int getItemCount() {
return 40;
}
class ItemViewHolder extends RecyclerView.ViewHolder{
TextView tv;
ItemViewHolder(View itemView) {
super(itemView);
tv = (TextView) itemView.findViewById(R.id.tv);
}
}
};
}}
这里非常简单的例子只是为了测试notifyItemChanged,它只在发布到消息队列时起作用,而不是在setAdapter之后直接调用。
setAdapter 触发对requestlayout() 的调用,这是否意味着notifyItemChanged 在布置项目时不会发生?
【问题讨论】:
标签: android android-recyclerview android-adapter