我试图遵循这个tutorial
我有一个使用侧边栏导航的项目,因此我有一个MainActivity
和多个碎片。在视频的大约6:20,您可以看到以下代码:
PersonListAdapter adapter = new PersonListAdapter(
this,
R.layout.adapter_view_layout,
peopleList);
PersonListAdapter类的构造函数是:
public PersonListAdapter(Context context, int resource, ArrayList<Attacks> objects) {
super(context, resource, objects);
this.mContext = mContext;
mResource = resource;
}
问题在于上下文。
本教程使用MainActivity.java,但我的代码在FragmentCharacters.java中。我不知道我应该写什么来代替&#34; 这个&#34;,或者如果我需要在PersonListAdapter类中更改Context的内容。
答案 0 :(得分:0)
您不能将Fragment用作Context,因为Fragment不会从Context继承。
但是,如果您查阅Fragment lifecycle,您可以看到Fragment可以在生命周期回调OnActivityCreated()和onDestroyView()之间的任何时间访问其主机Activity。例如,如果您尝试在OnActivityCreated()之前访问Activity,它可能会返回null。
因此,请确保从onActivityCreated()或更高版本中调用getActivity(),这将确保您的Activity可用。
答案 1 :(得分:-1)
更新,我在代码片段中提供了一个案例,我选择了#34; FragmentName&#34;例如片段名称。
首先看看这个片段结构。
我在onCreate
和onCreateView
我为Forth参数添加了FragmentName.this
原因是,您可以将数据从适配器发送到其他活动,例如FragmentName.mAdapter.getLayoutPosition()
但是,我们假设我们有一个在MainActivity中的ImageView,我们想在我们的适配器中使用它,所以让我们在片段中建立一个ImageView,注意我声明了ImageView Inside onCreate
而且,另一个例子,让我们假设我们在片段末尾有一个公共虚空,它可以是字面上的任何东西。我将其命名为ExampleClass
/////////FIRST TAKE A LOOK AT FRAGMENT//////////
public class FragmentName extends Fragment {
PersonListAdapter adapter;
ImageView imageView; // For Example thi ImageView is from MainActivity
public FragmentName() {
...
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
...
adapter = new PersonListAdapter(getContext(), R.layout.adapter_view_layout, peopleList, FragmentName.this);
imageView = (ImageView) getActivity().findViewById(R.id.ImageView);
// This Imageview is in Another Activity, Like MainActivity
// So we Need to Find it Using 'getActivity()'
...
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
adapter = new PersonListAdapter(getContext(), R.layout.adapter_view_layout, peopleList, FragmentName.this);
}
}
public void ExampleClass(int color, ...) {
...
}
////////////////////////////////////////////////////////////////
&#13;
现在,让我们将此示例带入我们的适配器,以显示如何使用它。
但是,在适配器中使用[FragmentName],而不是像下面这样的[Fragment]:
///////////NOW INSIDE YOUR ADAPTER/////////////
public class PersonListAdapter extends RecyclerView.Adapter < PersonListAdapter.myViewHolder > {
FragmentName myFragment; // SEE WHAT HAPPENDED HERE?
...
public PersonListAdapter(Context context, int resource, ArrayList < Attacks > objects, FragmentName fragment) {
super(context, resource, objects);
this.mContext = mContext;
mResource = resource;
this.myFragment = fragment
}
@Override
public PersonListAdapter.myViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
// Example use of myFragment
// Lets Execute ExmpleClass inside the Fragment
myFragment.ExampleClass(int color, ...);
// Let's Use the ImageView from MainActivity Here
myFragment.imageView.setImageRresource(...);
...
}
...
// YOU CAN NOW USE "myFragment" As a Context In your Adapter
&#13;
关于这一点的好处是你可以在PersonListAdapter中使用片段作为上下文
更新:第二个代码,onCreateViewHolder错误,它必须在ViewHolder或onBindViewHolder中的ClickListener内部