android - 如何在片段内的回收器视图中调用主要活动代码?
问题描述
我已经准备好所有东西来设置我的片段通信,但我唯一的问题是如何让回收器视图itemVitem.setOnClickListener
调用主要活动中的覆盖接口方法,以便我可以获取该数据并创建一个意图去详细活动或更新双窗格布局的详细信息片段,更多解释在下面的代码注释中提供。
主要活动
public class MainActivity extends AppCompatActivity implements ListFragment.Listener {
// the method to be called when an item in recycler view is clicked
// so i can pass this data to DetailFragment
@Override
public void listener(String firstName, String lastName) {
DetailFragment detailFragment = new DetailFragment();
detailFragment.updateText(firstName, lastName);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
回收器视图适配器
public class ViewHolder extends RecyclerView.ViewHolder {
public TextView tvFirstName;
public TextView tvLastName;
public ViewHolder(@NonNull View itemView) {
super(itemView);
tvFirstName = itemView.findViewById(R.id.row_first_name);
tvLastName = itemView.findViewById(R.id.row_last_name);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// how to call the "listener()" method in main activity
}
});
}
包含回收站视图的片段
public class ListFragment extends Fragment {
private static final String TAG = "ListFragment";
private RecyclerView recyclerView;
private RecyclerViewAdapter recyclerViewAdapter;
// fragment communication interface
public interface Listener {
void listener(String firstName, String lastName);
}
private Listener listener;
@Override
public void onAttach(@NonNull Context context) {
super.onAttach(context);
try {
this.listener = (Listener) context;
} catch (ClassCastException e) {
Log.d(TAG, "onAttach: "+ e.getMessage());
}
}
public ListFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_list, container, false);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
recyclerView = getView().findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
// some dummy data to fill the recycler view
ArrayList<User> users = new ArrayList<>();
users.add(new User("hiwa", "jalal"));
users.add(new User("mohammed", "abdullah"));
recyclerViewAdapter = new RecyclerViewAdapter(users, getActivity());
recyclerView.setAdapter(recyclerViewAdapter);
}
}
细节片段
public class DetailFragment extends Fragment {
private TextView tvFirstName;
private TextView tvLastName;
public DetailFragment() {
// Required empty public constructor
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_detail, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
tvFirstName = view.findViewById(R.id.detail_frag_first_name);
tvLastName = view.findViewById(R.id.detail_frag_last_name);
}
// update the details fragment views
public void updateText(String firstName, String lastName) {
tvFirstName.setText(firstName);
tvLastName.setText(lastName);
}
}
解决方案
传递listener
给您RecyclerViewAdapter
并使用它来调用回调
recyclerViewAdapter = new RecyclerViewAdapter(users, getActivity(), listener);
更新RecyclerViewAdapter
如下
class RecyclerViewAdapter {
private Listener mListener;
....
public RecyclerViewAdapter(ArrayList<User> users, Context context, Listener listener) {
....
mListener = listener;
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
....
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.listener(first_name. last_name);
}
});
....
}
....
}
推荐阅读
- github - github:通过提交评论关闭问题(不是提交消息)
- python - 将离线 CRM 数据转换为 google 测量协议格式
- python - matplotlib实时图表上的可滚动x?
- mvvm - MVVM“只能在 DependencyObject 的 DependencyProperty 上设置‘绑定’。”
- python - 我需要使用 python 从脚本标签内的网页中提取数据
- javascript - Javascript 解构询问
- oracle - 基于表中两个条目的触发触发器
- storybook - Storybook:如何拥有一个带有选项的“选择”控件以及自由文本?
- c# - PrintPreviewDialog 打印空白页
- flutter - 如何更改 FutureBuilder 中的状态