如何在片段内的回收器视图中调用主活动代码?



我已经准备好了设置片段通信的所有内容,但我唯一的问题是我如何使回收器视图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);
}
});
....
}
....
}

在适配器类中创建方法。

private Listener mListener;
public void setListener(Listener listener){
mListener = listener
}
public void removeListener(){
mListener = null;
}

在片段类中,设置如下所示的侦听器。

recyclerViewAdapter = new RecyclerViewAdapter(users, getActivity());
recyclerViewAdapter.setListener(listener);

在视图持有人中

holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.listener(first_name. last_name);
}
});

同样在片段的 OnDestroy 或 OnDestroyView(( 中,调用

removeListener() to avoid memory leak.

最新更新