从 Main Activity 调用方法到 Fragment Adapter
Call method from Main Activity into Fragment Adapter
如何从我的 activity 中调用一个方法到我的片段适配器中?我在我的片段上使用 RecyclerView 并且在这个片段适配器中有意图。我已经在我的 Main Activity 中创建了一个方法,但我无法从我的 Fragment Adapter 中调用它。
主要方法Activity
public void showInterstitial() {
if(interstitialAd != null && interstitialAd.isLoaded()) {
interstitialAd.show();
loadingIklan=true;
}
}
我想将该方法放入片段适配器的 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();
}
}
我的主要片段
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;
}
}
谁能帮我提供正确的代码?谢谢。
interfacesample.java
public interface sample{
function onclick();
}
activity.java
class activity extends appcombatactivity implements sample{
override onclick(){
//do whatever you want to do
}
}
//adapter.java
switch (getAdapterPosition()) {
case 0:
//getActivity show red code//
(context as activity).onclick()
break;
default:
intent = new Intent(context, AllBlock.class);
break;
}
类似的东西。希望你能理解。如果有任何疑问,请告诉我。
您不应从 RecyclerView 适配器调用 activity。适配器应该只处理数据表示。因此,您需要一个 Listener/Callback 模式。因为您的适配器是从片段附加到 activity 的片段调用的,所以您需要创建一个嵌套的 Listener/Callback.
首先,在RecyclerView适配器中创建监听接口。接口的目的是告诉监听器(即片段)做某事。
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.
}
}
}
}
Third,创建监听器以在 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");
}
}
}
第四,执行片段侦听器以告知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);
}
}
}
}
Fifth,将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 一起使用,因为它简化了所有侦听器代码。掌握 Listener/Callback 模式后,您可以尝试使用 EventBus。 霍拉斯!
如何从我的 activity 中调用一个方法到我的片段适配器中?我在我的片段上使用 RecyclerView 并且在这个片段适配器中有意图。我已经在我的 Main Activity 中创建了一个方法,但我无法从我的 Fragment Adapter 中调用它。
主要方法Activity
public void showInterstitial() {
if(interstitialAd != null && interstitialAd.isLoaded()) {
interstitialAd.show();
loadingIklan=true;
}
}
我想将该方法放入片段适配器的 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();
}
}
我的主要片段
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;
}
}
谁能帮我提供正确的代码?谢谢。
interfacesample.java
public interface sample{
function onclick();
}
activity.java
class activity extends appcombatactivity implements sample{
override onclick(){
//do whatever you want to do
}
}
//adapter.java
switch (getAdapterPosition()) {
case 0:
//getActivity show red code//
(context as activity).onclick()
break;
default:
intent = new Intent(context, AllBlock.class);
break;
}
类似的东西。希望你能理解。如果有任何疑问,请告诉我。
您不应从 RecyclerView 适配器调用 activity。适配器应该只处理数据表示。因此,您需要一个 Listener/Callback 模式。因为您的适配器是从片段附加到 activity 的片段调用的,所以您需要创建一个嵌套的 Listener/Callback.
首先,在RecyclerView适配器中创建监听接口。接口的目的是告诉监听器(即片段)做某事。
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.
}
}
}
}
Third,创建监听器以在 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");
}
}
}
第四,执行片段侦听器以告知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);
}
}
}
}
Fifth,将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 一起使用,因为它简化了所有侦听器代码。掌握 Listener/Callback 模式后,您可以尝试使用 EventBus。 霍拉斯!