Fragment 中的 RecyclerView 有时在 BottomNavigationView 项目触摸时为空

RecyclerView in Fragment is sometimes empty on BottomNavigationView item touch

我在Fragment (FrameLayout) 中的 RecyclerView 有时在 BottomNavigationView 项目触摸时是空的(有时你可以触摸 5x 并且它不是空的但然后又是空的直到下一次触摸)。

YouTube 片段

public class YouTuberFragment extends Fragment {

    private List<YouTuber> youtuber;

    private class GetYouTuber extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                InputStream inputStream = getActivity().getAssets().open("youtuber.json");
                BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
                StringBuilder total = new StringBuilder();
                String line;

                while ((line = bufferedReader.readLine()) != null) total.append(line);

                String m = total.toString();
                JSONObject jsonObject = new JSONObject(m);
                JSONArray jsonYouTuberArray = jsonObject.getJSONArray("youtuber");

                int youTubersCount = 0;
                if (jsonYouTuberArray != null) youTubersCount = jsonYouTuberArray.length();

                for (int i = 0; i < youTubersCount; i++) {
                    JSONObject jsonYouTuberObject = jsonYouTuberArray.getJSONObject(i);

                    YouTuber youTuber = new YouTuber(
                            jsonYouTuberObject.getString("name"),
                            jsonYouTuberObject.getString("role"),
                            jsonYouTuberObject.getString("picture"),
                            jsonYouTuberObject.getString("episodes"),
                            jsonYouTuberObject.getString("youtube")
                    );

                    youtuber.add(youTuber);
                }
            } catch (JSONException | IOException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);
        }
    }

    public YouTuberFragment() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View v = inflater.inflate(R.layout.fragment_youtuber, container, false);

        LinearLayoutManager llm = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);
        youtuber = new ArrayList<>();
        RVAdapter adapter = new RVAdapter(youtuber, getContext());

        new YouTuberFragment.GetYouTuber().execute();

        RecyclerView rv = (RecyclerView) v.findViewById(R.id.rv);
        rv.setLayoutManager(llm);
        rv.setHasFixedSize(true);
        rv.setAdapter(adapter);

        return v;
    }

}

RVAdapter

class RVAdapter extends RecyclerView.Adapter<RVAdapter.PersonViewHolder> {

    private final Context context;
    private Resources res;
    private List<YouTuber> youTuber;
    RVAdapter(List<YouTuber> youTuber, Context context){
        this.youTuber = youTuber;
        this.context = context;
    }

    static class PersonViewHolder extends RecyclerView.ViewHolder {
        CardView cv;
        ImageView ytPicture;
        TextView ytName;
        TextView ytRole;
        TextView ytEpisodes;
        Button ytYoutube;

        PersonViewHolder(View itemView) {
            super(itemView);

            cv = (CardView) itemView.findViewById(R.id.cv);
            ytPicture = (ImageView) itemView.findViewById(R.id.yt_picture);
            ytName = (TextView) itemView.findViewById(R.id.yt_name);
            ytRole = (TextView) itemView.findViewById(R.id.yt_role);
            ytEpisodes = (TextView) itemView.findViewById(R.id.yt_episodes);
            ytYoutube = (Button) itemView.findViewById(R.id.yt_youtube);
        }
    }

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    @Override
    public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_youtuber, viewGroup, false);
        res = v.getResources();
        PersonViewHolder pvh = new PersonViewHolder(v);
        return pvh;
    }

    @Override
    public void onBindViewHolder(final PersonViewHolder personViewHolder, final int i) {
        personViewHolder.ytPicture.setImageResource(res.getIdentifier(youTuber.get(i).picture, "drawable", BuildConfig.APPLICATION_ID));
        personViewHolder.ytName.setText(youTuber.get(i).name);
        personViewHolder.ytRole.setText(youTuber.get(i).role);
        personViewHolder.ytEpisodes.setText(res.getString(R.string.yt_episodes, youTuber.get(i).episodes));
        personViewHolder.ytYoutube.setText(youTuber.get(i).youtube);

        personViewHolder.ytYoutube.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Uri uri = Uri.parse("https://" + youTuber.get(i).youtube);

                Intent youtube_url = new Intent(Intent.ACTION_VIEW, uri);
                context.startActivity(youtube_url);
            }
        });
    }

    @Override
    public int getItemCount() {
        return youTuber.size();
    }
}

可能是您 运行 一个不同的线程来收集您的数据,而您的适配器初始化在主线程上 运行 并且在您的数据可以被检索之前被呈现。如果设备是空白的,您是否尝试过旋转设备?