我有五块碎片 (主页、设置、newPost、通知和个人资料) 在我 Main2Activity
.
内部 HomeFragment
我有一个 RecyclerView
有大量的帖子浏览量,每个帖子都包含一个 "打开 "按钮,应该打开一个 PostFragment
. 问题是,我只能用 setOnClickListener
在 RecyclerViewAdapter
类,在populateItemRows()方法中,所以当我不能使用 getActivity()
..
HomeFragment:
public class HomeFragment extends Fragment{
private RecyclerView recyclerView;
private RecyclerViewAdapter recyclerViewAdapter;
private boolean isLoading = false;
private ArrayList<String> rowsArrayList = new ArrayList<>();
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View root = inflater.inflate(R.layout.fragment_home, container, false);
recyclerView = root.findViewById(R.id.recyclerView);
initAdapter();
initScrollListener();
return root;
}
private void initAdapter() {
recyclerViewAdapter = new RecyclerViewAdapter(getActivity(),2);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(recyclerViewAdapter);
}
private void initScrollListener() {
...
}
private void loadMore() {
...
}
}
RecyclerViewAdapter.我的Main2Activity里面有5个碎片(home,settings,newPost,notifications和profile)。
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int VIEW_TYPE_ITEM = 0;
private final int VIEW_TYPE_LOADING = 1;
private ArrayList<Post> list = new ArrayList();
private static final String TAG = RecyclerViewAdapter.class.getSimpleName();
private String userId = FirebaseAuth.getInstance().getCurrentUser() != null ? FirebaseAuth.getInstance().getCurrentUser().getUid() : null;
private FirebaseFirestore db = FirebaseFirestore.getInstance();
private Context context;
private User currentUser;
private int type;
public RecyclerViewAdapter(Context context, int type) {
this.context = context;
this.type = type;
if (type == 0) {
myPostsRetriever(context);
} else if (type == 1) {
appliedToPostsRetriever(context);
} else if (type == 2) {
homePostsRetriever(context);
}
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
...
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
if (viewHolder instanceof ItemViewHolder) {
populateItemRows((ItemViewHolder) viewHolder, position);
} else if (viewHolder instanceof LoadingViewHolder) {
showLoadingView((LoadingViewHolder) viewHolder, position);
}
}
private void populateItemRows(ItemViewHolder viewHolder, int position) {
...
viewHolder.itemView.findViewById(R.id.seePostButton).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Fragment newFragment = new PostFragment();
FragmentTransaction transaction = getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mobile_navigation, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
});
}
你需要从构造中获得Context对象。
FragmentTransaction fm = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mobile_navigation, newFragment);
transaction.addToBackStack(null);
transaction.commit();
*注意 此言差矣
Context context= viewHolder.seePostButton.getContext();
Fragment newFragment = new PostFragment();
FragmentTransaction transaction = ((Main2Activity)context).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mobile_navigation, newFragment);
transaction.addToBackStack(null);
transaction.commit();`
或者你可以使用inteface将点击监听器从适配器传递到fragment,在fragment中你可以得到你的活动,看看这个。联系 对于这种方法
你可以使用一个接口来实现。
public interface OnItemClickListener {
void onItemClick(ContentItem item);
}
你需要修改你的适配器,使其以监听器为参数,就像下面所说的那样。
private final List<ContentItem> items;
private final OnItemClickListener listener;
public ContentAdapter(List<ContentItem> items, OnItemClickListener listener) {
this.items = items;
this.listener = listener;
}
Now in your onBindViewHolder method, set the click listener.
@Override public void onBindViewHolder(ViewHolder holder, int position) {
holder.bind(items.get(position), listener);
}
public void bind(final ContentItem item, final OnItemClickListener listener) {
...
itemView.setOnClickListener(new View.OnClickListener() {
@Override public void onClick(View v) {
listener.onItemClick(item);
}
});
}
现在在你的RecyclerView中设置适配器。
recycler.setAdapter(new ContentAdapter(items, new ContentAdapter.OnItemClickListener() {
@Override public void onItemClick(ContentItem item) {
Fragment newFragment = new PostFragment();
FragmentTransaction transaction =
getActivity().getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mobile_navigation, newFragment);
transaction.addToBackStack(null);
transaction.commit();
}
}));