Android 片段在 CustomListAdapter 中传递实例时遇到问题
Android fragment having problems in passing instance in CustomListAdapter
我有一个应用程序,它有一个可滚动的选项卡视图,其中每个选项卡都是一个片段。现在我希望每个选项卡都有一个自定义列表视图。但是根据我想出的代码,片段在传递其实例时存在问题,因为它需要 Activity 的实例。
这是在第 11 行出现错误的片段,其中适配器要求传递一个实例。
public class Department extends Fragment {
public Department(){}
private String TAG = Department.class.getSimpleName();
private static final String url = "http://api.androidhive.info/json/movies.json";
private List<Socs> socList = new ArrayList<>();
private ListView listView;
private CustomListAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dept,container,false);
listView = (ListView) rootView.findViewById(R.id.lvDept);
adapter = new CustomListAdapter(Department.this,socList);
listView.setAdapter(adapter);
JsonArrayRequest socRequest = new JsonArrayRequest(url,new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i=0;i<response.length() ; i++){
try {
JSONObject obj = response.getJSONObject(i);
Socs socs = new Socs();
socs.setDesc(obj.getString("title"));
socs.setName(obj.getString("title"));
socList.add(socs);
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("ERROR" + error.getMessage());
}
});
AppController.getInstance().addToRequestQueue(socRequest);
return rootView;
}
}
Android Studio 给出的错误是
CustomListAdapter (Android.app.Activity, List<socs>) can not be applied to CustomListAdapter(com..Department, List<socs>)
这是 CustomList
的适配器
public class CustomListAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Socs> socItems;
public CustomListAdapter(Activity activity, List<Socs> socItems){
this.activity = activity;
this.socItems = socItems;
}
@Override
public int getCount() {
return socItems.size();
}
@Override
public Object getItem(int position) {
return socItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater==null)
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView==null)
convertView = inflater.inflate(R.layout.list_row,null);
TextView nameL = (TextView) convertView.findViewById(R.id.socName);
TextView descL = (TextView) convertView.findViewById(R.id.socDesc);
Socs socs = socItems.get(position);
nameL.setText(socs.getName());
descL.setText(socs.getDesc());
return convertView;
}
}
以及可滚动选项卡适配器
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position){
case 0:
fragment = new Department();
break;
case 1:
fragment = new Technical();
break;
case 2:
fragment = new Cultural();
break;
case 3:
fragment = new StudentChapters();
}
return fragment;
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
String title = new String();
switch (position){
case 0:
title="Department";
break;
case 1:
title="Technical";
break;
case 2:
title="Cultural";
break;
case 3:
title="Student Chapters";
break;
default:
title=null;
break;
}
return title;
}
}
我尝试将部门更改为 Activity,但随后可滚动标签适配器出现错误。我尝试在 CustomListAdapter 中使用 getActivity() 但它在运行时给出了一个错误,因为我还没有为片段分配任何值,所以我正在向片段提供空馈送。只是为了检查,然后我给 fragment 一个临时值,这样它就可以膨胀默认视图。它仍然给出了一个空错误。
错误是因为您调用 CustomListAdapter();
时将片段作为第一个参数,而此对象的构造函数需要一个 activity。相反,您可以这样做:
new CustomListAdapter(Department.this.getActivity(),socList);
对于你的第二个问题,你能用你得到的错误更新你的问题吗?
我有一个应用程序,它有一个可滚动的选项卡视图,其中每个选项卡都是一个片段。现在我希望每个选项卡都有一个自定义列表视图。但是根据我想出的代码,片段在传递其实例时存在问题,因为它需要 Activity 的实例。 这是在第 11 行出现错误的片段,其中适配器要求传递一个实例。
public class Department extends Fragment {
public Department(){}
private String TAG = Department.class.getSimpleName();
private static final String url = "http://api.androidhive.info/json/movies.json";
private List<Socs> socList = new ArrayList<>();
private ListView listView;
private CustomListAdapter adapter;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.dept,container,false);
listView = (ListView) rootView.findViewById(R.id.lvDept);
adapter = new CustomListAdapter(Department.this,socList);
listView.setAdapter(adapter);
JsonArrayRequest socRequest = new JsonArrayRequest(url,new Response.Listener<JSONArray>() {
@Override
public void onResponse(JSONArray response) {
for (int i=0;i<response.length() ; i++){
try {
JSONObject obj = response.getJSONObject(i);
Socs socs = new Socs();
socs.setDesc(obj.getString("title"));
socs.setName(obj.getString("title"));
socList.add(socs);
} catch (JSONException e) {
e.printStackTrace();
}
}
adapter.notifyDataSetChanged();
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
VolleyLog.d("ERROR" + error.getMessage());
}
});
AppController.getInstance().addToRequestQueue(socRequest);
return rootView;
}
}
Android Studio 给出的错误是
CustomListAdapter (Android.app.Activity, List<socs>) can not be applied to CustomListAdapter(com..Department, List<socs>)
这是 CustomList
的适配器public class CustomListAdapter extends BaseAdapter {
private Activity activity;
private LayoutInflater inflater;
private List<Socs> socItems;
public CustomListAdapter(Activity activity, List<Socs> socItems){
this.activity = activity;
this.socItems = socItems;
}
@Override
public int getCount() {
return socItems.size();
}
@Override
public Object getItem(int position) {
return socItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (inflater==null)
inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView==null)
convertView = inflater.inflate(R.layout.list_row,null);
TextView nameL = (TextView) convertView.findViewById(R.id.socName);
TextView descL = (TextView) convertView.findViewById(R.id.socDesc);
Socs socs = socItems.get(position);
nameL.setText(socs.getName());
descL.setText(socs.getDesc());
return convertView;
}
}
以及可滚动选项卡适配器
public class SectionsPagerAdapter extends FragmentStatePagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position){
case 0:
fragment = new Department();
break;
case 1:
fragment = new Technical();
break;
case 2:
fragment = new Cultural();
break;
case 3:
fragment = new StudentChapters();
}
return fragment;
}
@Override
public int getCount() {
return 4;
}
@Override
public CharSequence getPageTitle(int position) {
String title = new String();
switch (position){
case 0:
title="Department";
break;
case 1:
title="Technical";
break;
case 2:
title="Cultural";
break;
case 3:
title="Student Chapters";
break;
default:
title=null;
break;
}
return title;
}
}
我尝试将部门更改为 Activity,但随后可滚动标签适配器出现错误。我尝试在 CustomListAdapter 中使用 getActivity() 但它在运行时给出了一个错误,因为我还没有为片段分配任何值,所以我正在向片段提供空馈送。只是为了检查,然后我给 fragment 一个临时值,这样它就可以膨胀默认视图。它仍然给出了一个空错误。
错误是因为您调用 CustomListAdapter();
时将片段作为第一个参数,而此对象的构造函数需要一个 activity。相反,您可以这样做:
new CustomListAdapter(Department.this.getActivity(),socList);
对于你的第二个问题,你能用你得到的错误更新你的问题吗?