我已经成功解析了带有背景AsyncTask的简单rss提要(XML提要)。但是无法使用BaseAdapter(MyBaseAdapter)将接收到的Feed从Fragment(FragmentTOI)设置为ListView。由于解析来自片段,因此我使用“ getActivity()”而不是“ MainActivity.this”。我可以在从rss xml feed解析的logcat中看到所有标题。随附代码段和Logcat屏幕截图。
代码:
public static class FragmentTOI extends Fragment {
ListView listView;
MyAsyncTask myAsyncTask;
Context context;
ArrayAdapter<String> arrayAdapter;
public FragmentTOI(Context context) {
this.context = context;
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
super.onCreateView (inflater, container, savedInstanceState);
View view = inflater.inflate (R.layout.fragment_toi, container, false);
listView = view.findViewById (R.id.list_view_toi);
startTask ();
return view;
}
// Method to start the AsyncTask with new one if null.
public void startTask() {
//if the download is empty then cancel, else start the task
if (myAsyncTask != null) {
myAsyncTask.cancel (true);
} else {
myAsyncTask = new MyAsyncTask (getActivity ());
myAsyncTask.execute ();
}
}
// Method to receive data from onPostExecute of AsyncTask.
public void receiveData(ArrayList<HashMap<String, String>> results) {
Log.d ("XML", "FragmentTOI receiveData Method: " + results);
listView.setAdapter (new MyBaseAdapter (getActivity (), results));
listView.setAdapter (arrayAdapter);
}
}`
已成功从AsyncTask解析,并将接收到的提要发送到片段中的receiveData方法:
public static class MyAsyncTask extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {
@Override
protected void onPostExecute(ArrayList<HashMap<String, String>> hashMaps) {
super.onPostExecute (hashMaps);
fragmentTOI.receiveData (hashMaps);
}
}
BaseAdapter:
public static class MyBaseAdapter extends BaseAdapter {
ArrayList<HashMap<String, String>> data;
LayoutInflater layoutInflater;
public MyBaseAdapter(Context context, ArrayList<HashMap<String, String>> data) {
this.data = data;
layoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return data.size ();
}
@Override
public Object getItem(int i) {
return data.get (i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View view, ViewGroup viewGroup) {
View view1 = view;
MyRowHolder myRowHolder = null;
if (view1 == null) {
view1 = layoutInflater.inflate (R.layout.single_row, viewGroup, false);
myRowHolder = new MyRowHolder (view1);
view1.setTag (myRowHolder);
} else {
myRowHolder = (MyRowHolder) view1.getTag ();
}
HashMap<String, String> currentItem = data.get (i);
myRowHolder.textViewTitle.setText (currentItem.get ("title"));
return view1;
}
}
static class MyRowHolder {
TextView textViewTitle;
public MyRowHolder(View view) {
textViewTitle = view.findViewById (R.id.text_view_title);
}
}
当将适配器设置为列表视图时,使用context
,如下所示。
// Method to receive data from onPostExecute of AsyncTask.
public void receiveData(ArrayList<HashMap<String, String>> results) {
//listView.setAdapter (new MyBaseAdapter (getActivity (), results)); // here you got exception.
// use context as you initialize it inside the constructor of your fragment.
listView.setAdapter (new MyBaseAdapter (context, results));
listView.setAdapter (arrayAdapter);
}
更新
您可以通过如下调用context
来初始化onAttach
。>>
@Override
public void onAttach(Activity activity) {
// TODO Auto-generated method stub
super.onAttach(activity);
context=activity;
}
尝试使用requireActivity()
或requireContext()
。