【问题标题】:ListView not populated. Problem with ViewPager and fragments未填充 ListView。 ViewPager 和片段的问题
【发布时间】:2019-05-31 14:55:12
【问题描述】:

我使用 ViewPager 切换了三个片段,第三个包含 ListView。

我的问题是 ListView 在我第一次切换到该片段时没有填充。我必须切换回第一个,然后再次切换回第三个,并且只会填充 ListView。这里似乎有什么问题?

ViewPager 是如何工作的?

这是我的 TabAdapter

public class TabAdapter extends FragmentStatePagerAdapter {
private final List<Fragment> mFragmentList = new ArrayList<>();
private final List<String> mFragmentTitleList = new ArrayList<>();

TabAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
    return mFragmentList.get(position);
}

public void addFragment(Fragment fragment, String title) {
    mFragmentList.add(fragment);
    mFragmentTitleList.add(title);
}

@Nullable
@Override
public CharSequence getPageTitle(int position) {
    return mFragmentTitleList.get(position);
}

@Override
public int getCount() {
    return mFragmentList.size();
}

}

这是列表视图的 ListAdapter

   public class ListAdapter extends BaseAdapter {
    private ArrayList data = new ArrayList();

    public ListAdapter(LinkedHashMap<String, ArrayList<String>> lhm) {
        try {
            data.addAll(lhm.entrySet());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public int getCount() {
        return data.size();
    }

    @Override
    public LinkedHashMap.Entry<String, ArrayList<String>> getItem(int position) {
        return (LinkedHashMap.Entry) data.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }
    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        final LinkedHashMap.Entry<String, ArrayList<String>> item = getItem(position);
        final ArrayList quotesList = item.getValue();
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.archive_list, parent, false);
        }
        TableRow tableRow = convertView.findViewById(R.id.container);
        TextView title = convertView.findViewById(R.id.title);
        ImageView copy = convertView.findViewById(R.id.copy);
        copy.setVisibility(View.INVISIBLE);
        title.setText(item.getKey() + " Quotes");

        tableRow.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), ViewActivity.class);
                intent.putExtra("title", item.getKey());
                intent.putStringArrayListExtra("quotes", quotesList);
                if (interstitialAd.isLoaded()) {
                    interstitialAd.show();
                    startActivity(intent);
                } else {
                    startActivity(intent);
                }
            }
        });
        return convertView;
    }
}

更新

问题似乎来自 Linkedhashmap。我尝试手动将值放入 Hashmap 并且它有效。现在的问题是我当前的代码。我通过从 firebase 检索数据来填充我的 hashmap,这似乎是问题所在?也许它的填充速度没有那么快?

    private void initArchives() {
    DatabaseReference dBase = FirebaseDatabase.getInstance().getReference().child("archive");
    dBase.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()) {
                DataPojo dp = snapshot.getValue(DataPojo.class);
                hm.put(dp.getName(), dp.getMessages());
            }
        }
        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });
}

  public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_archive, container, false);
    listView = view.findViewById(R.id.listView);
    searchView = view.findViewById(R.id.searchView);


    initArchives();
    listAdapter = new ListAdapter(hm);
    listView.setAdapter(listAdapter);
    listView.invalidateViews();

    loadAds();

    return view;
}

【问题讨论】:

    标签: java android android-fragments android-listview android-viewpager


    【解决方案1】:

    首先FragmentStatePagerAdapter 真的很蛋疼。但我们必须解决这个问题。我建议您 Ctrl + 单击FragmentStatePagerAdapter 并阅读源代码。

    另一件事是使用addFragment() 方法将片段添加到您的ArrayList 可能不是最好的主意,因为FragmentStatePagerAdapter 正在保存片段的状态并从它自己的FragmentManager 加载它们。

    所以你添加的片段可能不是你得到的片段。 一个可能的解决方案是使用标签。

    有一些关于hereherehere主题的必读文章。

    还有另一件事。 ViewPager 在使用 FragmentStatePagerAdapter 时一次创建三个片段。首先,它创建要显示的片段,然后是右侧的片段,最后是左侧的片段。由于您有三个片段,因此不会立即创建最后一个(第三个)片段(第一个片段的左侧没有片段)。也许您正在加载一些需要时间在第三个片段上下载的数据?下次显示第三个片段时,它会从FragmentStatePagerAdapter 的保存状态加载。这些只是一些需要考虑的可能性。不一定是正确的解决方案。祝你好运。

    【讨论】:

      猜你喜欢
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-04
      • 1970-01-01
      • 2021-03-04
      相关资源
      最近更新 更多