android - दृश्यपेज में SwipeRefreshLayout के साथ प्रदान की सूची के जमे हुए स्नैपशॉट
listview android-fragments (2)
एंड्रॉइड। Support.v4.app.FragmentActivity के उप-वर्ग वाला एंड्रॉइड गतिविधि पर विचार करें। इसमें FragmentStatePagerAdapter
पेजर एडाप्टर द्वारा प्रबंधित कई एपेज शामिल हैं। प्रत्येक पृष्ठ में android.support.v4.widget.SwipeRefreshLayout
। android.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
का उपयोग करने से बच सकते हैं लेकिन यह आवश्यक नहीं लगता है।