recyclerview头,从活动/碎片中的头访问对象 [英] recyclerview header, access objects from the header in the Activity/Fragment

查看:143
本文介绍了recyclerview头,从活动/碎片中的头访问对象的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

所以我跟着这个真棒答案让我recyclerview的头视图。伟大工程至今。现在是时候实施,但在这里,问题来了:我如何访问从我的片段标签或图像,以我观回收头

So I've followed this awesome answer to get an header view in my recyclerview. Works great so far. Now it's time for implementation, but here comes the problem: How do I access a label or an image from my Fragment to my recycler view header?

我所知道的其他方式,就按一下按钮,从任何回收视图架到我的片段任何事件处理程序,但我无法弄清楚如何做这种方式。

I know the other way around, on button click, on any event handler from any recycler view holder to my fragment, but I can't figure out how to do it this way.

为什么?

在我的头视图是的EditText,按钮和标签。当用户presses按钮,它需要从EditText上的文字,并通过一些接口,以我的片段发送。经过一番code处理这会给出一个结果一样,至少需要3个字符或API之后调用它会给像一个消息:还没有帖子对于这种

In my header view is a EditText, Button and label. When user presses the button, it takes the text from the EditText, and sends it via some interfaces to my Fragment. After some code handling this will give a result, like, at least 3 characters required or after an API call it will give an message like: "No posts yet for this."

我觉得这是不好的做法,做所有的API处理和recyclerViewHolder里面的想法。我preFER做这在我的片段,后来我不得不从一个片段切换到另一个(的TabBar),然后在的EditText自动填写并开始搜索帖子。

I think it is bad practice to do all the API handling and thinking inside that recyclerViewHolder. I prefer to do this in my fragment, and later I have to switch from one fragment to the other (tabbar) and then fill in the EditText automatically and start searching for posts.

有些code,我的片段:

Some code, my fragment:

@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;
}

在某些API调用:

   adapter.setNewData(posts);
   adapter.notifyDataSetChanged();

该适配器,pretty很多基本的一些调整的实施得到一个标题视图中有:

The Adapter, pretty much basic implementation with some tweaks to get an header view in there:

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.
        }

    }
}

问:如何从我的片段数据发送到 HeaderViewHolder

Question: How do I send data from my Fragment to HeaderViewHolder?

推荐答案

您可能的方法添加到您的适配器来接收要在标题中更新数据。在该方法中,调用 this.notifydataSetChanged()。那么适配器将在显示/重新显示你的头叫 onBindViewHolder()为你的头。

You could add a method to your Adapter to receive the data you want to update in the header. In that method, call this.notifydataSetChanged(). The Adapter will then call onBindViewHolder() for your header when your header is displayed/re-displayed.

这篇关于recyclerview头,从活动/碎片中的头访问对象的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆