所以我跟着this awesome answer在我的recyclerview中获得了一个标题视图。到目前为止效果很好。现在是实施的时候了,但问题出现了:如何从Fragment访问我的Recycler视图标题中的标签或图像?
我知道相反的方法,点击按钮,从任何回收者视图持有者到我的片段的任何事件处理程序,但我无法弄清楚如何这样做。
为什么?
在我的标题视图中是EditText,Button和label。当用户按下按钮时,它会从EditText中获取文本,并通过某些接口将其发送到我的Fragment。在进行一些代码处理之后,这将给出一个结果,比如,至少需要3个字符,或者在API调用之后,它会给出如下消息:“还没有帖子。”
我认为在recyclelerViewHolder中进行所有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;
}
在接到一些api电话之后:
adapter.setNewData(posts);
adapter.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.
}
}
}
问题:如何将片段中的数据发送到HeaderViewHolder
?
答案 0 :(得分:2)
您可以向适配器添加一个方法,以便在标头中接收要更新的数据。在该方法中,请致电this.notifydataSetChanged()
。然后,当显示/重新显示标题时,适配器将为您的标题调用onBindViewHolder()
。