【问题标题】:RecyclerView in Fragment is sometimes empty on BottomNavigationView item touchFragment 中的 RecyclerView 有时在 BottomNavigationView 项目触摸时为空
【发布时间】:2017-03-25 19:11:35
【问题描述】:

我在Fragment (FrameLayout) 中的RecyclerView 有时在BottomNavigationView 项目触摸时为空(有时您可以触摸 5 次但它不是空的,但在下一次触摸之前它又是空的)。

YouTuberFragment

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();
    }
}

【问题讨论】:

    标签: java android android-fragments android-recyclerview bottomnavigationview


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2017-03-21
      • 1970-01-01
      • 1970-01-01
      • 2018-06-22
      • 2011-09-19
      • 2015-10-25
      相关资源
      最近更新 更多