Android recyclerview标头,从活动/片段中的标头访问对象

Android recyclerview标头,从活动/片段中的标头访问对象,android,android-fragments,interface,android-recyclerview,Android,Android Fragments,Interface,Android Recyclerview,因此,我在我的recyclerview中获得了一个标题视图。到目前为止效果很好。现在是实现的时候了,但问题来了:如何从片段访问标签或图像到回收器视图标题 我知道另一种方法,点击按钮,在任何事件处理程序上,从任何回收者视图持有者到我的片段,但我不知道如何这样做 为什么? 在我的标题视图中是一个编辑文本、按钮和标签。当用户按下按钮时,它从EditText中获取文本,并通过一些接口将其发送到我的片段。在一些代码处理之后,这将给出一个结果,比如,至少需要3个字符,或者在一个API调用之后,它将给出一个消

因此,我在我的recyclerview中获得了一个标题视图。到目前为止效果很好。现在是实现的时候了,但问题来了:如何从片段访问标签或图像到回收器视图标题

我知道另一种方法,点击按钮,在任何事件处理程序上,从任何回收者视图持有者到我的片段,但我不知道如何这样做

为什么?

在我的标题视图中是一个编辑文本、按钮和标签。当用户按下按钮时,它从EditText中获取文本,并通过一些接口将其发送到我的片段。在一些代码处理之后,这将给出一个结果,比如,至少需要3个字符,或者在一个API调用之后,它将给出一个消息,比如:“还没有关于这个的帖子。”

我认为在RecycleServiceWholder中进行所有API处理和思考是一种不好的做法。我更喜欢在我的片段中这样做,然后我必须从一个片段切换到另一个片段(tabbar),然后自动填写EditText并开始搜索帖子

一些代码,我的片段:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_find, container, false);
    List<Post> emptyPosts = new ArrayList<>();

    adapter = new FindAdapter(emptyPosts);
    adapter.setClickListener(this);
    recyclerView = (RecyclerView) view.findViewById(R.id.rvFindList);
    LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity().getBaseContext());
    recyclerView.setLayoutManager(layoutManager);
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
    return view;
}
适配器是一个基本的实现,通过一些调整可以在其中获得标题视图:

public class FindAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;
    List<Post> posts = Collections.emptyList();
    private ClickListenerFindList listener;

    public interface ClickListenerFindList{
        void FindClicked(View view, int position);
    }


    public FindAdapter(List<Post> posts) {
        this.posts = posts;

    }

    public void setNewData(List<Post> posts)
    {
        this.posts = posts;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.responses_row, parent, false);
            return new MyViewHolder(view);
        } else if (viewType == TYPE_HEADER) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.find_header, parent, false);
            return new HeaderViewHolder(view);
        }
        throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof MyViewHolder) {
            MyViewHolder viewHolder = (MyViewHolder)holder;
            Post post = getItem(position);
            //...set contents for post
        } else if (holder instanceof HeaderViewHolder) {
            HeaderViewHolder headerView = (HeaderViewHolder) holder;
            //...set some extra values if needed

        }
    }

    //extra methods like getItemCounts, getItemViewType, isPositionHeader, getItem

    public void setClickListener(ClickListenerFindList listener)
    {
        this.listener = listener;
    }


    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        //...fields, buttons, etc.

        public MyViewHolder(View itemView) {
            super(itemView);
            //...initiating fields, set one click listener to get back to fragment
        }

        @Override
        public void onClick(View v) {
            if(listener != null)
            {
                listener.FindClicked(v, getAdapterPosition());
            }
        }
    }

    class HeaderViewHolder  extends RecyclerView.ViewHolder
    {
        //...fields, buttons, etc.
       //how do I access them from fragment?

        public HeaderViewHolder(View itemView) {
            super(itemView);
            //..initiate fields, buttons, etc.
        }

    }
}
公共类FindAdapter扩展了RecyclerView.Adapter{
私有静态最终int TYPE_头=0;
私有静态最终整数类型\ u项=1;
List posts=Collections.emptyList();
私有ClickListenerFindList侦听器;
公共界面ClickListenerFindList{
void findClick(视图,int位置);
}
公共FindDapter(列出职位){
这个.posts=posts;
}
公共void setNewData(列出帖子)
{
这个.posts=posts;
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
if(viewType==类型\项){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.responses\u行,parent,false);
返回新的MyViewHolder(视图);
}else if(viewType==类型\标题){
View=LayoutFlater.from(parent.getContext()).flate(R.layout.find_头,parent,false);
返回新的HeaderViewHolder(视图);
}
抛出新的RuntimeException(“没有与类型“+viewType+”+匹配的类型,请确保正确使用类型”);
}
@凌驾
BindViewHolder上的公共无效(RecyclerView.ViewHolder,int位置){
if(MyViewHolder的持有者实例){
MyViewHolder viewHolder=(MyViewHolder)holder;
Post Post=获取项目(位置);
//…设置发布内容
}else if(头枕支架实例){
HeaderViewWorder headerView=(HeaderViewWorder)支架;
//…如果需要,设置一些额外的值
}
}
//其他方法,如getItemCounts、getItemViewType、isPositionHeader、getItem
公共无效设置ClickListener(ClickListenerFindList listener)
{
this.listener=listener;
}
类MyViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
//…字段、按钮等。
公共MyViewHolder(查看项目视图){
超级(项目视图);
//…初始化字段,设置一次单击侦听器以返回片段
}
@凌驾
公共void onClick(视图v){
if(侦听器!=null)
{
FindClicked(v,getAdapterPosition());
}
}
}
类HeaderViewHolder扩展了RecyclerView.ViewHolder
{
//…字段、按钮等。
//如何从片段中访问它们?
public HeaderService文件夹(视图项视图){
超级(项目视图);
//…启动字段、按钮等。
}
}
}

问题:如何将数据从片段发送到
HeaderViewWholder

您可以向适配器添加一个方法,以接收要在标头中更新的数据。在该方法中,调用
this.notifydataSetChanged()
。然后,当显示/重新显示标题时,适配器将为标题调用
onBindViewHolder()

如果不调用notifyDataSetChanged,这难道不能吗?因为这也会(我猜?)更新整个列表。。难道没有一个带有接口或其他东西的解决方案吗?它应该只绑定可见行的视图持有者-如果不是,则标题将是无的。
public class FindAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final int TYPE_HEADER = 0;
    private static final int TYPE_ITEM = 1;
    List<Post> posts = Collections.emptyList();
    private ClickListenerFindList listener;

    public interface ClickListenerFindList{
        void FindClicked(View view, int position);
    }


    public FindAdapter(List<Post> posts) {
        this.posts = posts;

    }

    public void setNewData(List<Post> posts)
    {
        this.posts = posts;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if (viewType == TYPE_ITEM) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.responses_row, parent, false);
            return new MyViewHolder(view);
        } else if (viewType == TYPE_HEADER) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.find_header, parent, false);
            return new HeaderViewHolder(view);
        }
        throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly");
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        if (holder instanceof MyViewHolder) {
            MyViewHolder viewHolder = (MyViewHolder)holder;
            Post post = getItem(position);
            //...set contents for post
        } else if (holder instanceof HeaderViewHolder) {
            HeaderViewHolder headerView = (HeaderViewHolder) holder;
            //...set some extra values if needed

        }
    }

    //extra methods like getItemCounts, getItemViewType, isPositionHeader, getItem

    public void setClickListener(ClickListenerFindList listener)
    {
        this.listener = listener;
    }


    class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

        //...fields, buttons, etc.

        public MyViewHolder(View itemView) {
            super(itemView);
            //...initiating fields, set one click listener to get back to fragment
        }

        @Override
        public void onClick(View v) {
            if(listener != null)
            {
                listener.FindClicked(v, getAdapterPosition());
            }
        }
    }

    class HeaderViewHolder  extends RecyclerView.ViewHolder
    {
        //...fields, buttons, etc.
       //how do I access them from fragment?

        public HeaderViewHolder(View itemView) {
            super(itemView);
            //..initiate fields, buttons, etc.
        }

    }
}