如何停止ViewPager片段ato Initialize

时间:2016-07-22 06:27:22

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

我有3个片段,当我启动app所有片段从服务器同时获取数据时,但我需要一些像youtube view pager fragment

这样的东西

当用户滑动标签然后片段开始从服务器下载数据时,

在我的情况下,所有片段都会在同一时间启动asynctask,所以如果你的互联网速度慢,那么应用程序就会停止运行

public class HeadLineFragment extends Fragment {

private static final String TAG = "RecyclerViewFragment";
private static final String KEY_LAYOUT_MANAGER = "layoutManager";
private static final int SPAN_COUNT = 2;
private static final int DATASET_COUNT = 60;
private static final String DW_HOME_PAGE_URL = "https://rss.dw.de/xml/rss-urd-all";
protected LayoutManagerType mCurrentLayoutManagerType;
protected RadioButton mLinearLayoutRadioButton;
protected RadioButton mGridLayoutRadioButton;
protected RecyclerView mRecyclerView;
protected RecyclerAdapter mAdapter;
protected RecyclerView.LayoutManager mLayoutManager;

protected ArrayList<String> titles = new ArrayList();
protected ArrayList<String> ImageURLS = new ArrayList<>();
protected ArrayList<String> description = new ArrayList();
protected ArrayList<RssItem> mDataset = new ArrayList<>();
private TextView textView;
private Context context;
private Elements metalinks;
private String mImageURL;
private Document documentImage;
private ProgressBar mProgressBar;
private int mItemNumber;
private myPagerAdupter _myPagerAdupter;

@Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);



    setRetainInstance(true);
    this._myPagerAdupter= new myPagerAdupter(getChildFragmentManager(),getContext());



}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.head_line_fragment, container, false);


    new LoadRssFeedsItems().execute(DW_HOME_PAGE_URL);
    this.context = rootView.getContext();



    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);
    mProgressBar = (ProgressBar) rootView.findViewById(R.id.Progressbar);
    mProgressBar.setProgress(0);

    LoadRssFeedsItems loadRssFeedsItems = new LoadRssFeedsItems();

    loadRssFeedsItems.setCircularProgressView(mProgressBar);




    mLayoutManager = new LinearLayoutManager(getActivity());

    mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;

    if (savedInstanceState != null) {

        mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState
                .getSerializable(KEY_LAYOUT_MANAGER);
    }
    setRecyclerViewLayoutManager(mCurrentLayoutManagerType);


    return rootView;
}


public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) {
    int scrollPosition = 0;

    if (mRecyclerView.getLayoutManager() != null) {
        scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager())
                .findFirstCompletelyVisibleItemPosition();
    }

    switch (layoutManagerType) {
        case GRID_LAYOUT_MANAGER:
            mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT);
            mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER;
            break;
        case LINEAR_LAYOUT_MANAGER:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
            break;
        default:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
    }

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.scrollToPosition(scrollPosition);
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

    savedInstanceState.putSerializable(KEY_LAYOUT_MANAGER, mCurrentLayoutManagerType);
    super.onSaveInstanceState(savedInstanceState);
}


private enum LayoutManagerType {
    GRID_LAYOUT_MANAGER,
    LINEAR_LAYOUT_MANAGER
}


private class LoadRssFeedsItems extends AsyncTask<String, Integer, String> {
    private String mTitle, mDescription, mLink, mPubDate;

    private ProgressBar circularProgressView;

    public void setCircularProgressView(ProgressBar circularProgressView) {
        this.circularProgressView = circularProgressView;
    }


    protected String doInBackground(String... urls) {
        try {

            Document rssDocument = Jsoup.connect(DW_HOME_PAGE_URL).timeout(Constants.TIME_OUT).ignoreContentType(true).parser(Parser.xmlParser()).get();


            Elements mItems = rssDocument.select(Constants.ITEM);
            RssItem rssItem;
            mItemNumber = 0;
            for (Element element : mItems) {

                mItemNumber++;
                mTitle = element.select("title").first().text();
                mDescription = element.select("description").first().text();
                mLink = element.select("link").first().text();
                mPubDate = element.select("pubDate").first().text();


                Log.i(TAG, "Item title: " + (mTitle == null ? "N/A" : mTitle));
                Log.i(TAG, "Item Description: " + (mDescription == null ? "N/A" : mDescription));
                Log.i(TAG, "Item link: " + (mLink == null ? "N/A" : mLink));
                Log.i(TAG, "Item data: " + (mPubDate == null ? "N/A" : mPubDate));
                Log.i(TAG, "Item image link: " + (mImageURL == null ? "N/A" : mImageURL));
                Log.i(TAG, "item: : " + mItemNumber);
                rssItem = new RssItem(mTitle, mDescription, mPubDate, mLink, mItemNumber, getContext());
                mDataset.add(rssItem);


            }

        } catch (Exception e) {
            e.printStackTrace();
        }
        return "d";
    }

    @Override
    protected void onProgressUpdate(Integer... value) {
        super.onProgressUpdate(value);
        if (circularProgressView != null) {

            circularProgressView.setProgress(value[0]);
        }

    }


    protected void onPostExecute(String result) {
        if (mDataset.isEmpty()) {
            Snackbar mSnackbar = Snackbar.make(getView(), "Unable to connect  Home page", Snackbar.LENGTH_LONG)
                    .setAction("RETRY", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            new LoadRssFeedsItems().execute(Constants.HALAT_HAZRA);


                        }
                    });
            mSnackbar.show();
        } else {
            mAdapter = new RecyclerAdapter(mDataset);
            Log.i(TAG, "m data set size in current affairs: " + mDataset.size());

            mRecyclerView.setAdapter(mAdapter);
            getImageUrls get_ImageUrls = new getImageUrls();

            get_ImageUrls.execute();
        }
    }
}

private class getImageUrls extends AsyncTask<Void, Void, Void> {
    String mLink;
    String mLastHalfUrl;
    String url;
    int dash_A_index;

    @Override
    protected void onPreExecute() {
        Snackbar.make(getView(), "Loding Photos...", Snackbar.LENGTH_LONG)
                .setAction("Action", null).show();
    }

    @Override
    protected Void doInBackground(Void... params) {

        Log.i(TAG, "Item image link in seacond thread: " + (mImageURL == null ? "N/A" : mImageURL));

        try {



            for (int i = 0; i < mDataset.size(); i++) {
                Thread.sleep(50);
                mLink = mDataset.get(i).getLink();

                dash_A_index = mLink.indexOf(Constants.BACK_SLASH_A);
                mLastHalfUrl = mLink.substring(dash_A_index);
                url = mLink.replace(Constants.BASE_URL, "");
                url = url.replace(mLastHalfUrl, "");
                url = StringUtils.replaceEach(URLEncoder.encode(url, "UTF-8"), new String[]{"+", "*", "%7E"}, new String[]{"%20", "%2A", "~"});
                StringBuilder sb = new StringBuilder(url);
                url = sb.append(mLastHalfUrl).toString();
                url = Constants.BASE_URL + url;
                documentImage = Jsoup.connect(url).timeout(Constants.TIME_OUT).get();
                metalinks = documentImage.select(Constants.MATA_PROPTY_IMAGE);
                mImageURL = metalinks.attr(Constants.CONTENT);
                Log.i(TAG, "Item image link in seacond thread home page: " + (mImageURL == null ? "N/A" : mImageURL));
                mDataset.get(i).setImageUrl(mImageURL);

            }

        } catch (Exception e) {

        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {

        Constants.IS_GET_IMAGE_URL=true;
        mAdapter.notifyDataSetChanged();
    }
}

}

public class MainActivity extends AppCompatActivity
implements NavigationView.OnNavigationItemSelectedListener, MaterialTabListener {

    private Bitmap bitmap;
    RecyclerView recyclerView;
    private static final String TAG = "viewPge";
    RecyclerView.LayoutManager layoutManager;
    RecyclerView.Adapter RecyclerViewadapter;
    MaterialTabHost tabHost;
    private String[] tabs;

    ViewPager mViewPager;
    private FragmentManager fragmentManager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        getSupportActionBar().setElevation(0);


        tabs = getResources().getStringArray(R.array.tabs);

        tabHost = (MaterialTabHost) this.findViewById(R.id.materialTabHost);
        mViewPager = (ViewPager) this.findViewById(R.id.myViewPager);


        this.mViewPager.setAdapter(new myPagerAdupter(getSupportFragmentManager(),getApplicationContext()));

        this.mViewPager.setOffscreenPageLimit(2);
        this.mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {

                tabHost.setSelectedNavigationItem(position);
            }
        });


        for (int i = 0; i < 3; i++) {
            tabHost.addTab(
                    tabHost.newTab().setText(tabs[i])


                            .setTabListener(this)
            );
        }


        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();


            }
        });

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
        drawer.setDrawerListener(toggle);
        toggle.syncState();

        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
        navigationView.setNavigationItemSelectedListener(this);
    }
        @Override
    public void onBackPressed() {
        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        if (drawer.isDrawerOpen(GravityCompat.START)) {
            drawer.closeDrawer(GravityCompat.START);
        } else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    @SuppressWarnings("StatementWithEmptyBody")
    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        // Handle navigation view item clicks here.
        int id = item.getItemId();

        if (id == R.id.nav_camera) {
            // Handle the camera action
        } else if (id == R.id.nav_gallery) {

        } else if (id == R.id.nav_slideshow) {

        } else if (id == R.id.nav_manage) {

        } else if (id == R.id.nav_share) {

        } else if (id == R.id.nav_send) {

        }

        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
        drawer.closeDrawer(GravityCompat.START);
        return true;
    }

    @Override
    public void onTabSelected(MaterialTab tab) {



        mViewPager.setCurrentItem(tab.getPosition());

    }

    @Override
    public void onTabReselected(MaterialTab tab) {

    }

    @Override
    public void onTabUnselected(MaterialTab tab) {

    }


    public void addFragment() {
        fragmentManager = getSupportFragmentManager();
        android.support.v4.app.FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        healthNewFragment recylerViewFragment = new healthNewFragment();
        fragmentTransaction.replace(R.id.frag_contaner, recylerViewFragment, "TAG_FRAGEMENT");
        //  fragmentTransaction.addToBackStack(null);
        fragmentTransaction.commit();
    }
   }

片段2

    @Override
public void onCreate(Bundle savedInstanceState) {


    super.onCreate(savedInstanceState);


    this.context = getContext();
    Log.i(TAG_LIFE, "Inside onCreat");


    new LoadRssFeedsItems().execute(DW_HOME_PAGE_URL);


}

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    Log.i(TAG_LIFE, "Inside onViewCreated");
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.head_line_fragment, container, false);

    this.context = rootView.getContext();


    Log.i(TAG_LIFE, "Inside onCreateView");

    mRecyclerView = (RecyclerView) rootView.findViewById(R.id.recycler_view);

    mLayoutManager = new LinearLayoutManager(getActivity());

    mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;

    if (savedInstanceState != null) {

        mCurrentLayoutManagerType = (LayoutManagerType) savedInstanceState
                .getSerializable(KEY_LAYOUT_MANAGER);
    }
    setRecyclerViewLayoutManager(mCurrentLayoutManagerType);


    return rootView;
}


public void setRecyclerViewLayoutManager(LayoutManagerType layoutManagerType) {
    int scrollPosition = 0;


    if (mRecyclerView.getLayoutManager() != null) {
        scrollPosition = ((LinearLayoutManager) mRecyclerView.getLayoutManager())
                .findFirstCompletelyVisibleItemPosition();
    }

    switch (layoutManagerType) {
        case GRID_LAYOUT_MANAGER:
            mLayoutManager = new GridLayoutManager(getActivity(), SPAN_COUNT);
            mCurrentLayoutManagerType = LayoutManagerType.GRID_LAYOUT_MANAGER;
            break;
        case LINEAR_LAYOUT_MANAGER:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
            break;
        default:
            mLayoutManager = new LinearLayoutManager(getActivity());
            mCurrentLayoutManagerType = LayoutManagerType.LINEAR_LAYOUT_MANAGER;
    }

    mRecyclerView.setLayoutManager(mLayoutManager);
    mRecyclerView.scrollToPosition(scrollPosition);
}

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {

    savedInstanceState.putSerializable(KEY_LAYOUT_MANAGER, mCurrentLayoutManagerType);
    super.onSaveInstanceState(savedInstanceState);
}


private enum LayoutManagerType {
    GRID_LAYOUT_MANAGER,
    LINEAR_LAYOUT_MANAGER
}



private class LoadRssFeedsItems extends AsyncTask<String, Void, String> {
    private String mTitle, mDescription, mLink, mPubDate;

    protected String doInBackground(String... urls) {
        try {

            Document rssDocument = Jsoup.connect(Constants.HEALTH).timeout(Constants.TIME_OUT).ignoreContentType(true).parser(Parser.xmlParser()).get();

            Document imageURLDocument;


            Elements mItems = rssDocument.select(Constants.ITEM);
            RssItem rssItem;
            String mLastHalfUrl;
            String url;
            int dash_A_index;
            int i = 0;
            for (Element element : mItems) {
                i++;
                mTitle = element.select("title").first().text();
                mDescription = element.select("description").first().text();
                mLink = element.select("link").first().text();
                mPubDate = element.select("pubDate").first().text();
                Log.i(TAG, "Item title: " + (mTitle == null ? "N/A" : mTitle));
                Log.i(TAG, "Item Description: " + (mDescription == null ? "N/A" : mDescription));
                Log.i(TAG, "Item link: " + (mLink == null ? "N/A" : mLink));
                Log.i(TAG, "Item data: " + (mPubDate == null ? "N/A" : mPubDate));
                Log.i(TAG, "Item image link: " + (mImageURL == null ? "N/A" : mImageURL));
                Log.i(TAG, "int i : " + i);
                rssItem = new RssItem(mTitle, mDescription, mPubDate, mLink, i, getContext());
                mDataset.add(rssItem);

            }



        } catch (Exception e) {
            e.printStackTrace();
        }
        return "d";
    }


    protected void onPostExecute(String result) {

        if (mDataset == null) {
            Log.i(TAG, "Connecction time out");
            Toast.makeText(getActivity(), "Connecction time ou)",
                    Toast.LENGTH_SHORT).show();
        }
        if (mDataset.isEmpty()) {
            Snackbar mSnackbar = Snackbar.make(getView(), "Unable to connect Health", Snackbar.LENGTH_LONG)
                    .setAction("RETRY", new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            new LoadRssFeedsItems().execute(Constants.HALAT_HAZRA);


                        }
                    });
            mSnackbar.show();
        } else {
            mAdapter = new RecyclerAdapter(mDataset);
            Log.i(TAG, "m data set size: " + mDataset.size());

            mRecyclerView.setAdapter(mAdapter);
            getImageUrls get_ImageUrls = new getImageUrls();
            get_ImageUrls.execute();
        }
    }
}

private class getImageUrls extends AsyncTask<Void, Void, Void> {
    String mLink;
    String mLastHalfUrl;
    String url;
    int dash_A_index;

    @Override
    protected Void doInBackground(Void... params) {

        Log.i(TAG, "Item image link in seacond thread: " + (mImageURL == null ? "N/A" : mImageURL));


        try {


            for (int i = 0; i < mDataset.size(); i++) {
                mLink = mDataset.get(i).getLink();
                dash_A_index = mLink.indexOf(Constants.BACK_SLASH_A);
                mLastHalfUrl = mLink.substring(dash_A_index);
                url = mLink.replace(Constants.BASE_URL, "");
                url = url.replace(mLastHalfUrl, "");
                url = StringUtils.replaceEach(URLEncoder.encode(url, "UTF-8"), new String[]{"+", "*", "%7E"}, new String[]{"%20", "%2A", "~"});
                StringBuilder sb = new StringBuilder(url);
                url = sb.append(mLastHalfUrl).toString();
                url = Constants.BASE_URL + url;
                documentImage = Jsoup.connect(url).get();
                metalinks = documentImage.select(Constants.MATA_PROPTY_IMAGE);
                mImageURL = metalinks.attr(Constants.CONTENT);
                Log.i(TAG, "Item image link in seacond thread: " + (mImageURL == null ? "N/A" : mImageURL));
                mDataset.get(i).setImageUrl(mImageURL);

            }

        } catch (Exception e) {

        }
        return null;
    }

    @Override
    protected void onPostExecute(Void aVoid) {

        mAdapter.notifyDataSetChanged();
    }
}

1 个答案:

答案 0 :(得分:0)

当片段可见时,通过添加以下方法并从CreateView中删除来调用异步任务。通过使用以下方法,只有在选中标签并且您的特定片段可见时,才会加载您的数据。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
    super.setUserVisibleHint(isVisibleToUser);

    if (isVisibleToUser) {

      new LoadRssFeedsItems().execute(DW_HOME_PAGE_URL);
    }
}