Frage Stoppen Sie ViewPagers in ListView beim Zurücksetzen


Ich habe ein ListView das enthält Zeilen von ViewPagers. Wenn ein ViewPager wird vom Bildschirm gescrollt, ich möchte seine Seitenposition speichern. Wenn der Benutzer zum ViewPager wieder möchte ich dann die zuletzt gespeicherte Seitenposition wiederherstellen.

Ich versuche das mit dem folgenden Code zu erreichen:

public class MyBaseAdapter extends BaseAdapter {

    // Row ids that will come from server-side, uniquely identifies each
    // ViewPager
    private List<String> mIds = new ArrayList<String>();
    private Map<String, Integer> mPagerPositions = new HashMap<String, Integer>();

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        String id = mIds.get(position);

        View rootView = convertView;
        if (rootView == null) {
            rootView = LayoutInflater.from(parent.getContext()).inflate(
                    R.layout.row, null);
        }

        ViewPager viewPager = (ViewPager) rootView.findViewById(R.id.pager);
        Integer pagerPosition = mPagerPositions.get(id);
        if (pagerPosition != null) {
            viewPager.setCurrentItem(pagerPosition);
        }
        viewPager.setOnPageChangeListener(new MyPageChangeListener(id));

        return rootView;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    private class MyPageChangeListener extends
            ViewPager.SimpleOnPageChangeListener {

        private String mId;

        public MyPageChangeListener(String id) {
            mId = id;
        }

        @Override
        public void onPageSelected(int position) {
            mPagerPositions.put(mId, position);
        }
    }
}

Die Seitenposition wird beim ersten Aufruf von gespeichert setPagerPosition(). Danach, wenn die ViewPager geht aus dem Bildschirm, onPageSelected() wird mit der ersten Seitenposition aufgerufen, die gespeichert wurde - Überschreiben aller vorherigen onPageSelected() Anrufe, die aufgetreten sind, wenn die ViewPager war noch sichtbar.

Was ist der richtige Weg, dies zu tun?


6
2018-03-13 07:37


Ursprung


Antworten:


Die Lösung bestand darin, die Pager-Position nicht zu überschreiben, wenn der ViewPager nicht sichtbar ist. Es scheint einen Fehler in Android zu geben, bei dem onPageSelected aufgerufen wird, wenn der ViewPager beim Scrollen durch die ListView ausgeht.

@Override
public void onPageSelected(int position) {
    if (viewPager.isShown()) {
        mTopicPositions.put(mId, position);
    }
}

3
2018-03-17 22:04



Ich denke, du kannst die aktuelle angezeigte Position durch erhalten indexOfChild(viewPager.getFocusedChild()) und speichern Sie es in einer gemeinsamen Einstellung, und können Sie es bei Bedarf abrufen. Hoffe das hilft


0
2018-03-16 05:34