java - 从主 Activity 调用方法到 fragment 适配器

标签 java android android-adapter

如何将方法从我的 Activity 调用到我的 fragment 适配器?我在 fragment 上使用 RecyclerView ,并且该 fragment 适配器内有 Intent 。我已经在主 Activity 中创建了一个方法,但无法从 fragment 适配器调用它。

主要 Activity 中的方法

public void showInterstitial() {
  if(interstitialAd != null && interstitialAd.isLoaded()) {
     interstitialAd.show();
     loadingIklan=true;
  }
}

我想将该方法放在 fragment 适配器上的 Intent 开关案例中

    public class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.ViewHolder> {


    public static class ViewHolder extends RecyclerView.ViewHolder {

        private TextView homeTitle;

        private Context context;

        public ViewHolder(View itemView) {
            super(itemView);
            context = itemView.getContext();
            homeTitle = (TextView)itemView.findViewById(R.id.homeTitle);

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    final Intent intent;
                    switch (getAdapterPosition()) {
                        case 0:
                            ((MainActivity) getActivity()).showInterstitial();
                            intent = new Intent(context, AllBlock.class);
                            break;
                        case 1:
                            intent = new Intent(context, BasicBlock.class);
                            break;

                        default:
                            intent = new Intent(context, AllBlock.class);
                            break;
                    }
                    context.startActivity(intent);
                }
            });
        }
    }


    public List<HomeData> homeList;

    public HomeAdapter(List<HomeData> homeList) {

        this.homeList = homeList;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.home_item, parent, false);
        ViewHolder viewHolder = new ViewHolder(view);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.homeTitle.setText(homeList.get(position).getHomeTitle());
    }

    @Override
    public int getItemCount() {
        return homeList.size();
    }
}

我的主要 fragment

public class Home extends Fragment {


    public Home() {
        // Required empty public constructor
    }


    private RecyclerView recyclerView;
    private HomeAdapter homeAdapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View view = inflater.inflate(R.layout.home, container, false);

        recyclerView = (RecyclerView)view.findViewById(R.id.recyclerview);
        RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

        homeAdapter = new HomeAdapter(homeDataList());
        recyclerView.setAdapter(homeAdapter);

        return view;
    }
}

任何人都可以帮我提供正确的代码吗?谢谢。

最佳答案

您不应从 RecyclerView 适配器调用 Activity 。适配器应该只处理数据呈现。因此,您需要一个监听器/回调模式。因为您的适配器是从 fragment 调用的,其中 fragment 附加到 Activity ,所以您需要创建一个嵌套的监听器/回调。

首先,在 RecyclerView 适配器中创建监听器接口(interface)。接口(interface)的目的是告诉监听者(即Fragment)做某事。

public class YourAdapter extends RecyclerView.Adapter<YourAdapter.ViewHolder> {

  ...
  private AdapterListener listener;

  // define the listener
  public interface AdapterListener {
    void onItemClicked(int position);
  }

  // register the listener with this method
  public setListener(AdapterListener listener) {
    this.listener = listener;
  }

  ...

  public ViewHolder(View itemView) {
    itemView.setOnClickListener(new View.OnClickListener() {
       @Override
       public void onClick(View view) {

         // tell the listener about the click
         if(listener != null) {
           listener.onItemClicked(getAdapterPosition());
         }

       }
  }

}

第二,将Fragment注册为监听器:

public class YourFragment extends Fragment {
  ...
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    ...
    // This is an example, you can register the listener in any method

    // sample
    YourAdapter adapter = new YourAdapter(...);

    YourAdapter.AdapterListener listener = new YourAdapter.AdapterListener {
       @Override
       public void onItemClicked(int position) {

         // handle the item click here.
       }
    }
  }
}

第三,创建监听器以在 Fragment 和 Activity 之间进行通信(了解更多信息 Communicating with Other Fragments:

public class YourFragment extends Fragment {
  private FragmentListener mListener;

  public interface FragmentListener {
    onRecyclerViewItemClicked(int position);
  }

  @Override
  public void onAttach(Context context) {
    super.onAttach(context);

    // This makes sure that the container activity has implemented
    // the callback interface. If not, it throws an exception
    try {
        mCallback = (FragmentListener) context;
    } catch (ClassCastException e) {
        throw new ClassCastException(context.toString()
                + " must implement FragmentListener");
    }
  }

}

第四,执行 fragment 监听器以告知 Activity 有关 recyclerView 项目点击的信息。在之前的Adapter监听中添加代码:

public class YourFragment extends Fragment {
  ...
  @Override
  public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {

    ...
    // This is an example, you can register the listener in any method

    YourAdapter adapter = new YourAdapter(...);

    YourAdapter.AdapterListener listener = new YourAdapter.AdapterListener {
       @Override
       public void onItemClicked(int position) {
         mListener.onRecyclerViewItemClicked(position);
       }
    }
  }
}

第五,将 Activity 注册为监听器接收器。因此,您执行实际的逻辑:

public class YourActivity extends Activity
        implements YourFragment.FragmentListener {

  ...

  @Ovveride
  public void onRecyclerViewItemClicked(int position) {
    // Handle the RecyclerView item click here
    switch(position) {
      case 0:
        showInterstitial();
        break;
     default:
       intent = new Intent(this, AllBlock.class);
       startActivity(intent);
    }
  }
}
<小时/>

注意:

我倾向于使用事件总线机制 EventBus因为它简化了所有监听器代码。掌握监听器/回调模式后,您可以尝试 EventBus。 霍拉斯!

关于java - 从主 Activity 调用方法到 fragment 适配器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47727268/

相关文章:

java - 如何在maven项目中添加自己的jar文件

java - 按内部对象的字段分组

java - 为什么接口(interface)变量是public

android - 如何在不跳过布局的情况下为内部 RecyclerView 项目设置适配器?

android - 带有附件的邮件的 RecyclerView 无法正确显示附件

android - 更改 RecyclerView 中 Item Click 上 TextView 的值?

java - Android 尝试运行 unix 可执行文件 : syntax error: '__TEXT' unexpected

android - 用于同时显示 5 个 View 的 ViewPager 或 Android 中的其他选项?

android - 识别正则表达式模式的类型

java - 为什么这个错误: Could not find class 'oauth.路标.http.HttpParameters