使用BaseAdapter时,片段TabLayout中的NullPointerException

问题描述 投票:0回答:2

我已经成功解析了带有背景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);
    }
}

Logcat:Logcat:

android android-studio android-fragments android-listview android-tablayout
2个回答
1
投票

当将适配器设置为列表视图时,使用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;
}

0
投票

尝试使用requireActivity()requireContext()

© www.soinside.com 2019 - 2024. All rights reserved.