如何将方法从我的 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/