You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Leanback BrowseFragment选中头部Profile项时打开页面的实现方法

How to Navigate to Profile Fragment/Activity from BrowseFragment on Profile Item Click

Got it, let's walk through exactly how to make your Profile grid item open a corresponding Fragment or Activity when tapped. I'll break this down into actionable steps using your existing code as a starting point.

Option 1: Handle Clicks Directly in the GridItemPresenter

First, we'll modify your GridItemPresenter to support click callbacks, so we can trigger navigation when the item is tapped.

Step 1: Update GridItemPresenter with Click Listener

Add a click listener interface to your presenter, then bind the click event to the item view:

public class GridItemPresenter extends Presenter {
    // Define a callback interface for item clicks
    public interface OnGridItemClickListener {
        void onGridItemClicked(Object item);
    }

    private OnGridItemClickListener mClickListener;

    // Setter for the click listener
    public void setOnGridItemClickListener(OnGridItemClickListener listener) {
        mClickListener = listener;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent) {
        // Since you're adding a string ("View Profile"), use a TextView instead of ImageView for better display
        TextView itemView = new TextView(parent.getContext());
        itemView.setLayoutParams(new ViewGroup.LayoutParams(
                ViewGroup.LayoutParams.WRAP_CONTENT,
                ViewGroup.LayoutParams.WRAP_CONTENT
        ));
        itemView.setGravity(Gravity.CENTER);
        itemView.setTextSize(18);
        itemView.setPadding(16, 16, 16, 16);
        return new ViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, Object item) {
        String profileText = (String) item;
        TextView textView = (TextView) viewHolder.view;
        textView.setText(profileText);

        // Bind click event to trigger the callback
        viewHolder.view.setOnClickListener(v -> {
            if (mClickListener != null) {
                mClickListener.onGridItemClicked(item);
            }
        });
    }

    @Override
    public void onUnbindViewHolder(ViewHolder viewHolder) {
        // Clean up the click listener to avoid memory leaks
        viewHolder.view.setOnClickListener(null);
    }
}

Step 2: Set Up Navigation in BrowseFragment

Now, in your BrowseFragment, attach the click listener to your mGridPresenter and handle the navigation logic:

// Your existing code
HeaderItem gridHeader = new HeaderItem(2, "Profile"); 
GridItemPresenter mGridPresenter = new GridItemPresenter(); 
ArrayObjectAdapter gridRowAdapter = new ArrayObjectAdapter(mGridPresenter); 
gridRowAdapter.add(getResources().getString(R.string.view_profile)); 
rowsAdapter.add(new ListRow(gridHeader, gridRowAdapter));

// Add click listener to handle navigation
mGridPresenter.setOnGridItemClickListener(item -> {
    String itemText = (String) item;
    if (itemText.equals(getResources().getString(R.string.view_profile))) {
        // Option A: Navigate to a Profile Activity
        Intent profileIntent = new Intent(getActivity(), ProfileActivity.class);
        startActivity(profileIntent);

        // Option B: Navigate to a Profile Fragment (if using a fragment container)
        // ProfileFragment profileFragment = new ProfileFragment();
        // getActivity().getSupportFragmentManager()
        //     .beginTransaction()
        //     .replace(R.id.your_fragment_container_id, profileFragment)
        //     .addToBackStack(null)
        //     .commit();
    }
});

Option 2: Handle Clicks Globally in BrowseFragment

If you prefer a centralized approach for all item clicks, you can override the onItemClicked method in your BrowseFragment:

@Override
public void onItemClicked(Presenter.ViewHolder itemViewHolder, Object item, 
                          RowPresenter.ViewHolder rowViewHolder, Row row) {
    super.onItemClicked(itemViewHolder, item, rowViewHolder, row);
    
    // Check if the clicked item is the Profile entry
    if (item instanceof String) {
        String itemText = (String) item;
        HeaderItem rowHeader = row.getHeaderItem();
        
        // Match the header ID (2) and the item text to confirm it's the Profile item
        if (rowHeader.getId() == 2 && itemText.equals(getResources().getString(R.string.view_profile))) {
            // Execute your navigation logic here (same as Option 1)
            Intent profileIntent = new Intent(getActivity(), ProfileActivity.class);
            startActivity(profileIntent);
        }
    }
}

Key Notes

  • Activity vs Fragment: Choose the navigation type based on your app's architecture. Use an Activity if Profile is a top-level screen, or a Fragment if it's part of a single-Activity setup.
  • Presenter Adjustment: Since you're adding a string to the grid adapter, switching the presenter to use a TextView (instead of ImageView) ensures the "View Profile" text displays correctly.

内容的提问来源于stack exchange,提问作者usman gulzar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 10:47:37