查看回收后,Jake Wharton的LinePageIndicator不会重新启动

时间:2015-12-20 14:50:46

标签: android android-listview baseadapter viewpagerindicator

我遇到了ListView适配器的问题。我正在尝试开发一个简单的时间轴视图。我已决定使用ListViewBaseAdapter,以便有效地显示垂直行中的项目。一切似乎都很好,但是重用用于可视化列表中项目的视图存在问题。每个项目都有三个TextView(标题,详细信息和故事),ViewPager我用它来显示照片,Jake Wharton LinePageIndicator显示有多少张照片和哪些照片目前正在显示它们。

ViewPager中始终加载了正确的图片,并且从左向右滑动,但指示灯无法正常工作。有时会显示有两张照片虽然只有一张照片(这是因为之前的视图有两张照片)而且没有显示当前显示ViewPager中的第一张照片。它显示了上一个视图中ViewPager的最后一个当前位置。

显然指标存在问题,每次视图回收时都应以某种方式重新启动。我已经查看了LinePageIndicator来源并看到setViewPager(...)方法有此

if (mViewPager != null) {
    //Clear us from the old pager.
    mViewPager.setOnPageChangeListener(null);
}

但显然没有帮助......

最后这是我的getView(...)方法

...
@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        TextView txtTimelineItemTitle;
        TextView txtTimelineItemDetails;
        TextView txtTimelineItemText;
        ViewPager viewPager;
        LinePageIndicator indicator;

        if (convertView == null) {
            convertView = LayoutInflater.from(context)
                    .inflate(R.layout.timeline_item, parent, false);
            txtTimelineItemTitle = (TextView) convertView.findViewById(R.id.timeline_item_title);
            txtTimelineItemDetails = (TextView) convertView.findViewById(R.id.timeline_item_details);
            txtTimelineItemText = (TextView) convertView.findViewById(R.id.timeline_item_text);
            viewPager = (ViewPager) convertView.findViewById(R.id.timeline_view_pager);
            indicator = (LinePageIndicator) convertView.findViewById(R.id.indicator);
            convertView.setTag(new ViewHolder(context, txtTimelineItemTitle, txtTimelineItemDetails, txtTimelineItemText, viewPager, indicator));
        } else {
            ViewHolder viewHolder = (ViewHolder) convertView.getTag();
            txtTimelineItemTitle = viewHolder.txtTimelineItemTitle;
            txtTimelineItemDetails = viewHolder.txtTimelineItemDetails;
            txtTimelineItemText = viewHolder.txtTimelineItemText;
            viewPager = viewHolder.viewPager;
            indicator = viewHolder.indicator;
        }

        Story story = (Story) getItem(position);
        txtTimelineItemTitle.setText(story.getTitle());
        txtTimelineItemDetails.setText(Utils.dateFormat.format(stories.get(position).getDate()) + ", " + stories.get(position).getLocation());
        txtTimelineItemText.setText(story.getText());

        if (story.getImages().isEmpty()) {
            viewPager.setVisibility(View.GONE);
            indicator.setVisibility(View.GONE);
        } else {
            viewPager.setVisibility(View.VISIBLE);
            indicator.setVisibility(View.VISIBLE);

            ImageAdapter imageAdapter = new ImageAdapter(context);
            imageAdapter.updateImages(story.getImages());
            viewPager.setAdapter(imageAdapter);
            indicator.setViewPager(viewPager);
        }

        return convertView;
    }
...

你们有没有人遇到这样的问题?如何修复,如果没有,是否有其他选择?

非常感谢

1 个答案:

答案 0 :(得分:0)

由于这对我来说非常重要,我继续探索LinePageIndicator的源代码。我已经看到除方法setViewPager(ViewPager viewPager)之外还有方法setViewPager(ViewPager view, int initialPosition),您可以看到它允许您在ViewPager中设置当前项目。我在上面的代码中只更改了一行 它解决了我的问题。

indicator.setViewPager(viewPager, 0); //always start from the first item in the ViewPager