无法从另一个片段打开一个片段。

问题描述 投票:0回答:1

我有五块碎片 (主页、设置、newPost、通知和个人资料) 在我 Main2Activity.

内部 HomeFragment 我有一个 RecyclerView 有大量的帖子浏览量,每个帖子都包含一个 "打开 "按钮,应该打开一个 PostFragment. 问题是,我只能用 setOnClickListenerRecyclerViewAdapter 类,在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();
            }
        });
    }
android android-fragments fragmenttransaction
1个回答
1
投票

你需要从构造中获得Context对象。

FragmentTransaction fm = ((AppCompatActivity) context).getSupportFragmentManager().beginTransaction();
transaction.replace(R.id.mobile_navigation, newFragment);
transaction.addToBackStack(null);
transaction.commit();

0
投票

*注意 此言差矣

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中你可以得到你的活动,看看这个。联系 对于这种方法


0
投票

你可以使用一个接口来实现。

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();        

    }
}));
© www.soinside.com 2019 - 2024. All rights reserved.