简体   繁体   中英

How to add Swipe Down Refresh feature in a Tab View Layout

This is the MainActivity of my Tab View Layout

package com.nitol.aust.cse.austclassmanager;


public class ResultCheckActivity extends AppCompatActivity implements 
NavigationView.OnNavigationItemSelectedListener{

private TabLayout t1;
private ViewPager vp1;
Toolbar toolbar;
DrawerLayout drawerLayout;
NavigationView navigationView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.navi_draw_result);

    t1 = (TabLayout) findViewById(R.id.tab1);
    vp1 = (ViewPager) findViewById(R.id.ViewPager1);


    setUpMyViewPager(vp1);
    t1.setupWithViewPager(vp1);


    toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout) ;
    navigationView = (NavigationView) findViewById(R.id.navigation_view);
    ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle
            (this,drawerLayout,toolbar, R.string.open_drawer, R.string.close_drawer);
    drawerLayout.setDrawerListener(actionBarDrawerToggle);
    actionBarDrawerToggle.syncState();
    navigationView.setNavigationItemSelectedListener(this);
    navigationView.getMenu().getItem(5).setChecked(true);



}

void setUpMyViewPager(ViewPager vp){

    ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getSupportFragmentManager());
    viewPagerAdapter.addMyFragment(new WebViewEvents(),"News & Events");
    viewPagerAdapter.addMyFragment(new WebViewAcademic(),"Academic Calendar");
    viewPagerAdapter.addMyFragment(new WebViewTheory(),"Theory Results");
    viewPagerAdapter.addMyFragment(new WebViewLab(),"Lab Results");
    viewPagerAdapter.addMyFragment(new WebViewTeacher(),"Faculty Members");


    vp.setAdapter(viewPagerAdapter);
}



class ViewPagerAdapter extends FragmentPagerAdapter {
    private final List<Fragment> my_list = new ArrayList<Fragment>();
    private final List<String> my_title = new ArrayList<String>();

    public ViewPagerAdapter(FragmentManager fragmentManager) {
        super(fragmentManager);
    }

    @Override
    public Fragment getItem(int position) {
        return my_list.get(position);
    }

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


    void addMyFragment(Fragment f, String title){
        my_list.add(f);
        my_title.add(title);
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return my_title.get(position);
    }

}




@Override
public void onBackPressed() {

    if(drawerLayout.isDrawerOpen(GravityCompat.START)){
        drawerLayout.closeDrawer(GravityCompat.START);
    }

    else{
        super.onBackPressed();
    }

}

@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {

    int id = item.getItemId();

    switch (id){

        case R.id.home:
            Intent intent0 = new Intent(ResultCheckActivity.this, MenuActivity.class);
            startActivity(intent0);
            finish();

            break;

        case R.id.routine:
            Intent intent = new Intent(ResultCheckActivity.this, ClassRoutineActivity.class);
            startActivity(intent);
            finish();

            break;

        case R.id.cgpa:
            Intent intent2 = new Intent(ResultCheckActivity.this, CgpaCalculator.class);
            startActivity(intent2);
            finish();

            break;

        case R.id.details:
            Toast.makeText(getApplicationContext(),"Class Details",Toast.LENGTH_SHORT).show();

            break;

        case R.id.quiz:
            Toast.makeText(getApplicationContext(),"Quiz Reminder",Toast.LENGTH_SHORT).show();

            break;

        case R.id.result:

            break;


        case R.id.profile:
            Intent intent3 = new Intent(ResultCheckActivity.this, ProfileActivity.class);
            startActivity(intent3);
            finish();

            break;

        case R.id.about:
            Toast.makeText(getApplicationContext(),"About",Toast.LENGTH_SHORT).show();

            break;

        case R.id.settings:
            Intent intent4 = new Intent(ResultCheckActivity.this, Settings.class);
            startActivity(intent4);
            finish();

            break;

    }

    drawerLayout.closeDrawer(GravityCompat.START);


    return true;
}


@Override
public boolean onCreateOptionsMenu(Menu menu) {

    getMenuInflater().inflate(R.menu.menu_tool,menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {

    int id = item.getItemId();

    if(id == R.id.tool_settings){
        Intent intent = new Intent(ResultCheckActivity.this, Settings.class);
        startActivity(intent);

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

        Toast.makeText(getApplicationContext(),"This is About !", Toast.LENGTH_SHORT).show();

    }

    return super.onOptionsItemSelected(item);
}
}

And this is my those tabs where i want to add refresh feature

void setUpMyViewPager(ViewPager vp){

ViewPagerAdapter viewPagerAdapter = new 
ViewPagerAdapter(getSupportFragmentManager());
viewPagerAdapter.addMyFragment(new WebViewEvents(),"News & Events");
viewPagerAdapter.addMyFragment(new WebViewAcademic(),"Academic Calendar");
viewPagerAdapter.addMyFragment(new WebViewTheory(),"Theory Results");
viewPagerAdapter.addMyFragment(new WebViewLab(),"Lab Results");
viewPagerAdapter.addMyFragment(new WebViewTeacher(),"Faculty Members");


vp.setAdapter(viewPagerAdapter);
}

Now suppose i want to add refresh on "WebViewEvents" class. The class is given below

package com.nitol.aust.cse.austclassmanager;

public class WebViewEvents  extends Fragment {

View v;
WebView wb4;

private String currentUrl = "http://aust.edu/news_events.htm";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    v = inflater.inflate(R.layout.webview_event, container,false);

    wb4 = (WebView) v.findViewById(R.id.webView_event);

    wb4.setInitialScale(1);
    wb4.getSettings().setJavaScriptEnabled(true);
    wb4.getSettings().setLoadWithOverviewMode(true);
    wb4.getSettings().setUseWideViewPort(true);
    wb4.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    wb4.setScrollbarFadingEnabled(false);
    wb4.loadUrl(currentUrl);
    wb4.setWebViewClient(new WebViewClient());
    wb4.getSettings().setBuiltInZoomControls(true);
    wb4.getSettings().setUseWideViewPort(true);
    wb4.getSettings().setLoadWithOverviewMode(true);
    wb4.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);


    return v;

}

}

I found some instructions here but maximum of those was said that i have to @Override onRefresh() method...but i declared my class as a non activity class. so in a non activity class , i can not override a method. that's why i am not finding my solutions...

You just need to read docs on SwipeRefreshLayout

First, add SwipeRefreshLayout to your activity layout:

<android.support.v4.widget.SwipeRefreshLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/swiperefresh"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    // here is your content

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

Then find instance of swipe refresh layout in your activity:

mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipeRefresh);

And set refresh listener in which trigger your update method

/*
 * Sets up a SwipeRefreshLayout.OnRefreshListener that is invoked when the user
 * performs a swipe-to-refresh gesture.
 */
mSwipeRefreshLayout.setOnRefreshListener(
    new SwipeRefreshLayout.OnRefreshListener() {
        @Override
        public void onRefresh() {
            Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout");

            // This method performs the actual data-refresh operation.
            // The method calls setRefreshing(false) when it's finished.
            myUpdateOperation();
        }
    }
);

For more information read docs, link in the beginning of the answer.

Also you might look at google samples:

List of all google samples you can find here

Hope it helps

Finally this is worked for me

package com.nitol.aust.cse.austclassmanager;
public class WebViewEvents  extends Fragment{

View v;
WebView wb4;
SwipeRefreshLayout mySwipeRefreshLayout;

private String currentUrl = "http://aust.edu/news_events.htm";

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    v = inflater.inflate(R.layout.webview_event, container,false);

    mySwipeRefreshLayout = (SwipeRefreshLayout) v.findViewById(R.id.swiperefresh);
    wb4 = (WebView) v.findViewById(R.id.webView_event);

    wb4.setInitialScale(1);
    wb4.getSettings().setJavaScriptEnabled(true);
    wb4.getSettings().setLoadWithOverviewMode(true);
    wb4.getSettings().setUseWideViewPort(true);
    wb4.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    wb4.setScrollbarFadingEnabled(false);
    wb4.loadUrl(currentUrl);
    wb4.setWebViewClient(new WebViewClient());
    wb4.getSettings().setBuiltInZoomControls(true);
    wb4.getSettings().setUseWideViewPort(true);
    wb4.getSettings().setLoadWithOverviewMode(true);
    wb4.getSettings().setCacheMode(WebSettings.LOAD_CACHE_ELSE_NETWORK);
    wb4.setWebViewClient(new MyWebViewClient());

    mySwipeRefreshLayout.setOnRefreshListener(
            new SwipeRefreshLayout.OnRefreshListener() {
                @Override
                public void onRefresh() {
                    wb4.loadUrl(currentUrl);
                }
            }
    );


    return v;

}

public class MyWebViewClient extends WebViewClient{

    @Override
    public void onPageFinished(WebView view, String url) {
        mySwipeRefreshLayout.setRefreshing(false);
        currentUrl = url;
        super.onPageFinished(view, url);
    }
}

}

I added this override method inside my class

mySwipeRefreshLayout.setOnRefreshListener(
        new SwipeRefreshLayout.OnRefreshListener() {
            @Override
            public void onRefresh() {
                wb4.loadUrl(currentUrl);
            }
        }
);

Then added this to stop the refreshing animation

public class MyWebViewClient extends WebViewClient{

@Override
public void onPageFinished(WebView view, String url) {
    mySwipeRefreshLayout.setRefreshing(false);
    currentUrl = url;
    super.onPageFinished(view, url);
}

} Don't forget to add the instance of the last stopping animation impliment

wb4.setWebViewClient(new MyWebViewClient());

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM