NullPointerException во Fragment TabLayout при использовании BaseAdapter - PullRequest
0 голосов
/ 28 октября 2019

Я успешно проанализировал простой RSS-канал (XML-канал) с фоновым AsyncTask. Но не удалось установить полученный фид из фрагмента (FragmentTOI) в ListView с помощью BaseAdapter (MyBaseAdapter). Поскольку синтаксический анализ происходит из фрагмента, я использовал «getActivity ()» вместо «MainActivity.this». Я вижу все заголовки в logcat, который анализируется из RSS-канала RSS. Прикрепленные фрагменты кода и скриншот Logcat.

Код:

    // Fragment
    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 (context, results));
            listView.setAdapter (arrayAdapter);
        }
    }

    // AsyncTask downloader
    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);
        }
    }

    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:

Ответы [ 2 ]

1 голос
/ 28 октября 2019

Опция - 1:

Попробуйте использовать requireActivity() или requireContext().

вместо

listView.setAdapter (new MyBaseAdapter (getActivity (), results));

используйте

listView.setAdapter (new MyBaseAdapter (requireActivity(), results));

Опция - 2: Нет необходимости передавать Context в Адаптер для получения LayoutInflater. Уберите это:

public MyBaseAdapter(Context context, ArrayList<HashMap<String, String>> data) {
    this.data = data;
    //layoutInflater = (LayoutInflater) context.getSystemService (Context.LAYOUT_INFLATER_SERVICE);
}

А внутри getView попробуйте так:

if (view1 == null) {
    view1 = LayoutInflater.from(viewGroup.getContext()).inflate (R.layout.single_row, viewGroup, false);
    myRowHolder = new MyRowHolder (view1);
    view1.setTag (myRowHolder);
}
1 голос
/ 28 октября 2019

Используйте 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...