android - दृश्यपेज में SwipeRefreshLayout के साथ प्रदान की सूची के जमे हुए स्नैपशॉट




listview android-fragments (2)

एंड्रॉइड। Support.v4.app.FragmentActivity के उप-वर्ग वाला एंड्रॉइड गतिविधि पर विचार करें। इसमें FragmentStatePagerAdapter पेजर एडाप्टर द्वारा प्रबंधित कई एपेज शामिल हैं। प्रत्येक पृष्ठ में android.support.v4.widget.SwipeRefreshLayoutandroid.support.v4.widget.SwipeRefreshLayout द्वारा लिपटे एक ListView । निम्न स्क्रीनशॉट इस गतिविधि की प्रारंभिक स्थिति को दर्शाता है।

अब, मैं पृष्ठ 0 पर सूची को ताज़ा करने के लिए नीचे स्वाइप करता हूं। ताज़ा करें एनीमेशन दिखाई देता है। अब, पृष्ठ 2 पर दाईं तरफ स्वाइप करें और फिर पेज 0 पर वापस जाएं।

ताज़ा एनीमेशन अभी भी दृश्यमान है। यह मेरे लिए अजीब लगता है क्योंकि पेज 0 नष्ट हो गया था और फिर से बनाया गया था। इसके अलावा, अगर मैं ज़ोर से मारना (पेज पर सूची के अंत तक स्क्रॉल करने की कोशिश कर रहा हूं) तो कुछ अजीब परत उस पृष्ठ पर गाया जाता है जो उस पृष्ठ की पुरानी अवस्था जिसमें इसे नष्ट किया गया था,

मुझे नहीं पता कि ऐसा क्यों होता है और इसे कैसे तय किया जाए किसी भी मदद के लिए धन्यवाद।

यहां एक न्यूनतम एप्लिकेशन का स्रोत कोड है जिसमें 3 लेआउट फ़ाइलें, एक गतिविधि वर्ग, एक टुकड़ा वर्ग, एक मैनिफ़ेस्ट फ़ाइल और बिल्ड स्क्रिप्ट शामिल है।

swipeandroid / src / मुख्य / res / लेआउट / service_schedule_activity.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.view.ViewPager
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/servicePager"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <android.support.v4.view.PagerTabStrip
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="top"/>

</android.support.v4.view.ViewPager>

swipeandroid / src / मुख्य / res / लेआउट / service_schedule_tab_fragment.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/serviceRefreshLayout"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/timeSlots"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.v4.widget.SwipeRefreshLayout>

swipeandroid / src / मुख्य / res / लेआउट / service_schedule_row.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/time"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"/>

</RelativeLayout>

swipeandroid / src / मुख्य / जावा / com / swipetest / ServiceScheduleActivity.java

package com.swipetest;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.view.ViewPager;

public class ServiceScheduleActivity extends FragmentActivity {
    @Override
    protected void onCreate(final Bundle inState) {
        // call super class
        super.onCreate(inState);

        // set content
        setContentView(R.layout.service_schedule_activity);

        // set up service pager
        ((ViewPager) findViewById(R.id.servicePager)).setAdapter(new ServiceFragmentPagerAdapter());
    }

    private class ServiceFragmentPagerAdapter extends FragmentStatePagerAdapter {
        public ServiceFragmentPagerAdapter() {
            super(getSupportFragmentManager());
        }

        @Override
        public int getCount() {
            return 5;
        }

        @Override
        public Fragment getItem(final int position) {
            return ServiceScheduleTabFragment.newInstance(position);
        }

        @Override
        public CharSequence getPageTitle(final int position) {
            return String.format("page %d", position);
        }
    }
}

swipeandroid / src / मुख्य / जावा / com / swipetest / ServiceScheduleTabFragment.java

package com.swipetest;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ListView;
import android.widget.TextView;

public class ServiceScheduleTabFragment extends Fragment {
    private static final String TAB_POSITION_ARGUMENT = "tabPosition";

    public static ServiceScheduleTabFragment newInstance(final int tabPosition) {
        // prepare arguments
        final Bundle arguments = new Bundle();
        arguments.putInt(TAB_POSITION_ARGUMENT, tabPosition);

        // create fragment
        final ServiceScheduleTabFragment fragment = new ServiceScheduleTabFragment();
        fragment.setArguments(arguments);
        return fragment;
    }

    @Override
    public View onCreateView(final LayoutInflater layoutInflater, final ViewGroup parent, final Bundle inState) {
        // create fragment root view
        final View rootView = layoutInflater.inflate(R.layout.service_schedule_tab_fragment, parent, false);

        // initialize time slot list view
        final ListView timeSlotListView = (ListView) rootView.findViewById(R.id.timeSlots);
        timeSlotListView.setAdapter(new TimeSlotListAdapter());

        // return fragment root view
        return rootView;
    }

    private int getTabPosition() {
        return getArguments().getInt(TAB_POSITION_ARGUMENT);
    }

    private static class TimeSlotRowViewHolder {
        private final TextView timeView;

        public TimeSlotRowViewHolder(final View rowView) {
            timeView = (TextView) rowView.findViewById(R.id.time);
        }

        public TextView getTimeView() {
            return timeView;
        }
    }

    private class TimeSlotListAdapter extends BaseAdapter {

        @Override
        public int getCount() {
            return 80;
        }

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

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

        @Override
        public View getView(final int position, final View convertView, final ViewGroup parent) {
            // reuse or create row view
            final View rowView;
            if (convertView != null) {
                rowView = convertView;
            } else {
                rowView = LayoutInflater.from(getContext()).inflate(R.layout.service_schedule_row, parent, false);
                rowView.setTag(new TimeSlotRowViewHolder(rowView));
            }

            // fill data
            final TimeSlotRowViewHolder rowViewHolder = (TimeSlotRowViewHolder) rowView.getTag();
            rowViewHolder.getTimeView().setText(String.format("tab %d, row %d", getTabPosition(), position));
            return rowView;
        }
    }
}

swipeandroid / src / मुख्य / AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
          package="com.swipetest"
          android:versionCode="1"
          android:versionName="1.0">

    <uses-sdk android:minSdkVersion="16" android:targetSdkVersion="23"/>

    <application
        android:name="android.app.Application"
        android:label="Swipe Test"
        android:allowBackup="false">

        <activity
            android:name="com.swipetest.ServiceScheduleActivity">

            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>

        </activity>

    </application>

</manifest>

swipeandroid / build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
    }
}

apply plugin: 'com.android.application'

repositories {
    mavenCentral()
}

dependencies {
    compile "com.android.support:support-v4:23.1.1"
}

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.2"
    buildTypes {
        debug {
            debuggable true
            minifyEnabled false
        }
    }
}

सूची साफ़ करने और फिर स्वाइप रिफ्रेश पर नया डेटा लोड करने का प्रयास करें।

जैसा कि टिप्पणी में बताया गया है


अंत में, मैंने एक वैकल्पिक हल खोज की है जो इस मुद्दे को कार्यान्वित करने और सुधार करने के लिए बहुत आसान है।

बस SwipeRefreshLayout द्वारा SwipeRefreshLayout उदाहरण लपेटो। ऐसा लगता है कि SwipeRefreshLayout को SwipeRefreshLayout पसंद नहीं है, एक पृष्ठ खंड के दृश्य पदानुक्रम की जड़ है।

वैसे भी, यह मुद्दा एंड्रॉइड सपोर्ट लाइब्रेरी में एक बग जैसा लग रहा है। Https://code.google.com/p/android/issues/detail?id=194957 देखें

मैंने उन अन्य समाधानों की भी कोशिश की है जो काम नहीं करते हैं:

  • FragmentStatePagerAdapter को ` FragmentStatePagerAdapter द्वारा प्रतिस्थापित करने में मदद नहीं करेगा।
  • कॉल करने के लिए mySwipeRefreshLayout.setRefreshing(false) में मदद नहीं करेगा।
  • FragmentStatePagerAdapter एडाप्टर को संशोधित करना ताकि यह नष्ट किए गए पृष्ठों के राज्यों को याद न करें, वे मदद नहीं करेंगे।

निम्न कार्य करने वाले किसी भी तरह से मदद कर सकते हैं लेकिन मैं SwipeRefreshLayout के सुझाए गए रैपिंग को वैसे भी पसंद करता हूं:

  • SwipeRefreshLayout.OnRefreshListener#onRefresh() में डेटा साफ़ करना (ताकि SwipeRefreshLayout.OnRefreshListener#onRefresh() में कोई पंक्तियां न हो) केवल तभी SwipeRefreshLayout.OnRefreshListener#onRefresh() हो जब ListView में पारदर्शी पृष्ठभूमि होती है। अवांछित स्नैपशॉट संभवतः अभी भी पहले पृष्ठ पर गाया जाता है लेकिन यह पूरी तरह से पारदर्शी है।
  • आप रीफ्रेश एनीमेशन के समय के लिए पेजिंग की अनुमति नहीं दे सकते। हालांकि, यह कुछ प्रयास करता है क्योंकि आपको दोनों ViewPager और PagerTabStrip उप-वर्ग चाहिए और अपने उपवर्गों में उचित यूआई इवेंट को रोकना होगा।
  • बेशक, आप पूरी तरह से ViewPager में SwipeRefreshLayout का उपयोग करने से बच सकते हैं लेकिन यह आवश्यक नहीं लगता है।




swiperefreshlayout