Android RecyclerView.Adapter是否可以/应该访问ViewHolder?
我在每个Android RecyclerView.Adapter是否可以/应该访问ViewHolder?,android,android-recyclerview,android-view,android-adapter,Android,Android Recyclerview,Android View,Android Adapter,我在每个视图中都有一个EditText,在onViewRecycled(.)中,我用任何用户输入更新适配器中的项目。用于在视图中滚动视图时维护信息 然而,我意识到,使用此解决方案检索已修改但未回收的信息有点麻烦。我通过将每个ViewHolder添加到Adapter(在onCreateViewHolder(.)中添加)中的一个单独列表来解决这个问题,因为我找不到更简单的方法来更新屏幕上的视图 是否有任何理由不这样做;让适配器直接访问视窗夹?也就是说,是否有更好的方法在当前存在的所有视图上调用函数
视图中都有一个EditText
,在onViewRecycled(.)
中,我用任何用户输入更新适配器中的项目。用于在视图中滚动视图时维护信息
然而,我意识到,使用此解决方案检索已修改但未回收的信息有点麻烦。我通过将每个ViewHolder
添加到Adapter
(在onCreateViewHolder(.)
中添加)中的一个单独列表来解决这个问题,因为我找不到更简单的方法来更新屏幕上的视图
是否有任何理由不这样做;让适配器
直接访问视窗夹
?也就是说,是否有更好的方法在当前存在的所有视图上调用函数
编辑:
公共类AdapterRv扩展适配器{
私人清单项目;
私人名单持有人;
公共适配器(列表初始项){
...
viewHolders=newarraylist();
}
公共类MyViewHolder扩展了RecyclerView.ViewHolder{
私人编辑文本;
私人物品;
私有MyViewHolder(查看查看){
...
}
公共无效bindItem(Item inItem){
...
}
}
@凌驾
public MyViewHolder onCreateViewHolder(ViewGroup inParent,int inViewType){
...
如果(!viewHolders.contains(tmpHolder)){
viewHolders.add(tmpHolder);
}
...
}
....
@凌驾
ViewRecycled上的公共无效(MyViewHolder inViewHolder){
saveView(inViewHolder.item、inViewHolder.text.getText().toString());
}
私有void saveViews(){
用于(MyViewHolder tmpViewHolder:ViewHolder){
saveView(tmpViewHolder.item、tmpViewHolder.text.getText().toString());
}
}
私有void saveView(Item inItem,newtext中的字符串){
if(inItem.getText().equals(inNewText)){
回来
}
inItem.setText(inNewText);
}
公共列表获取文本(){
保存视图();
退货项目;
}
}
RecyclerView.Adapter
的目的只是创建ViewHolder
实例并向其提供数据,但请求和管理持有者的是RecyclerView
本身
顾名思义,ViewHolder
的用途是保存项目的视图层次结构,以便视图可以被回收视图
缓存和重用。因此,适配器应该只创建正确的数据并将其绑定到持有者,建议不要在适配器内存储对持有者的任何引用,因为您只需要在onBindViewHolder中引用对持有者的引用(ViewHolder holder,int position
方法,由RecyclerView
提供。反之亦然,ViewHolder不需要适配器的引用,因此您的MyViewHolder
应标记为static
如果您需要在recycler的视图上进行操作,RecyclerView
的API中有很多方法,例如FindViewWholder for LayoutPosition(int position)
,getChildViewHolder(View child)
等。您还可以设置侦听器以观察滚动、项目触摸、视图附加状态等更改。
因此,如果您需要访问和操作视图(即对所有recycler的视图调用函数),请通过RecyclerView
而不是适配器进行操作,因为管理视图的是recycler,适配器只提供数据。您能添加一些代码吗,因此它是自解释的,您只需调用nmAdapter.notifyDataSetChanged();或者,正如@ParthAnjaria所说,共享一些代码有多种方式通知RecyclerView“刷新”这是viewsDone,代码补充。@cricket_007这些方式是什么?我不确定你想展示什么,但我非常怀疑你是否需要自己保留ViewHolder对象列表。我认为RecyclerView是在幕后自己做的顾名思义,ViewHolder的用途是保存项目的视图层次结构,以便RecyclerView可以缓存和重用视图。“
这是由android.support.v7.widget.RecyclerView.Recyclerer完成的,ViewHolder和视图重用是两件不同的事情,ViewHolder的目的是方便子视图查找,因此您不需要findViewById
内部onBindViewHolder
public class AdapterRv extends Adapter<AdapterRv.MyViewHolder> {
private List<Item> items;
private List<MyViewHoders> viewHolders;
public AdapterRv(List<Item> inItems) {
...
viewHolders = new ArrayList<>();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private EditText text;
private Item item;
private MyViewHolder(View inView) {
...
}
public void bindItem(Item inItem) {
...
}
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup inParent, int inViewType) {
...
if (!viewHolders.contains(tmpHolder)) {
viewHolders.add(tmpHolder);
}
...
}
....
@Override
public void onViewRecycled(MyViewHolder inViewHolder) {
saveView(inViewHolder.item, inViewHolder.text.getText().toString());
}
private void saveViews() {
for (MyViewHolder tmpViewHolder : viewHolders) {
saveView(tmpViewHolder.item, tmpViewHolder.text.getText().toString());
}
}
private void saveView(Item inItem, String inNewText) {
if (inItem.getText().equals(inNewText)) {
return;
}
inItem.setText(inNewText);
}
public List<Item> fetchTexts() {
saveViews();
return items;
}
}