如何将计时器实现为片段内的自动图像幻灯片?

How to implement timer into Automatically image slide inside the fragment?

如何实现timer到fragment里面图片自动滑动? 我使用了 Fragment 和 CustomSwipeAdapter,但我不知道将计时器放在哪里才能使图像自动滑动。它是在 Fragment 中还是在 CustomSwipe Adpater 中?

这是片段:

public class PrimaryFragment extends Fragment {


    public static ViewPager viewPager1;

    CustomSwipeAdapter adapter;
    public PrimaryFragment() {
        // Required empty public constructor

    }

   private String[] health ={"Abdominal Disorder","Abrasion","Aches","Anxiety","Bruises","Burns or Scalds","Constipation","Coughs" +
            "","Cramps","Diarrhea","Dizziness","Dyspepsia","Epilepsy","Fever","Gastric Problem" +
            "","High Blood Pressure","Hydrophobia","Tonsillitis"};


    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);



    }

    @Nullable

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
       // return inflater.inflate(R.layout.primary_layout,null);
        //((AppCompatActivity)getActivity()).getSupportActionBar().setTitle("First Aid and Survival Tips");



        View rootView = inflater.inflate(R.layout.primary_layout,container,false);

        viewPager1 = (ViewPager) rootView.findViewById(R.id.view_pager);
        adapter = new CustomSwipeAdapter(this.getActivity());
        viewPager1.setAdapter(adapter);


        ListView lv = (ListView) rootView.findViewById(R.id.oneListView);
        ArrayAdapter adapter = new ArrayAdapter(this.getActivity(),android.R.layout.simple_list_item_1,health);
        lv.setAdapter(adapter);


        lv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view,
                                    int position, long id) {
                // Toast.makeText(getActivity(),health[position],Toast.LENGTH_SHORT).show();
                if(position == 0) {
                    Intent intent = new Intent(view.getContext(), abdominal.class);
                    startActivity(intent);
                }
                if(position == 1) {
                    Intent intent = new Intent(view.getContext(), abrasion.class);
                    startActivity(intent);
                }
                if(position == 2) {
                    Intent intent = new Intent(view.getContext(), aches.class);
                    startActivity(intent);
                }
                if(position == 3) {
                    Intent intent = new Intent(view.getContext(), allergies.class);
                    startActivity(intent);
                }
                if(position == 4) {
                    Intent intent = new Intent(view.getContext(), bruises.class);
                    startActivity(intent);
                }
                if(position == 5) {
                    Intent intent = new Intent(view.getContext(), burns.class);
                    startActivity(intent);
                }
                if(position == 6) {
                    Intent intent = new Intent(view.getContext(), constipation.class);
                    startActivity(intent);
                }
                if(position == 7) {
                    Intent intent = new Intent(view.getContext(), coughs.class);
                    startActivity(intent);
                }
                if(position == 8) {
                    Intent intent = new Intent(view.getContext(), cramps.class);
                    startActivity(intent);
                }
                if(position == 9) {
                    Intent intent = new Intent(view.getContext(), diarrhea.class);
                    startActivity(intent);
                }
               // if(position == 10) {
               //     Intent intent = new Intent(view.getContext(), digestive.class);
                 //   startActivity(intent);
              //  }
                if(position == 10) {
                    Intent intent = new Intent(view.getContext(), dizziness.class);
                    startActivity(intent);
                }
                if(position == 11) {
                    Intent intent = new Intent(view.getContext(), dyspepsia.class);
                    startActivity(intent);
                }
                if(position == 12) {
                    Intent intent = new Intent(view.getContext(), epilepsy.class);
                    startActivity(intent);
                }
                if(position == 13) {
                    Intent intent = new Intent(view.getContext(), fever.class);
                    startActivity(intent);
                }
                if(position == 14) {
                    Intent intent = new Intent(view.getContext(), gastric.class);
                    startActivity(intent);
                }
                if(position == 15) {
                    Intent intent = new Intent(view.getContext(), highblood.class);
                    startActivity(intent);
                }
                if(position == 16) {
                    Intent intent = new Intent(view.getContext(), hydrophobia.class);
                    startActivity(intent);
                }
                if(position == 17) {
                    Intent intent = new Intent(view.getContext(), tonsilitis.class);
                    startActivity(intent);
                }
            }
        });
        return rootView;
    }}

CustomSwipeAdapter

 public class CustomSwipeAdapter extends PagerAdapter {
    private int[] image_resource = {R.drawable.one, R.drawable.two, R.drawable.three};
    private Context ctx;
    private LayoutInflater layoutInflater;

    public CustomSwipeAdapter(Context ctx) {
        this.ctx = ctx;
    }

    @Override
    public int getCount() {

        return image_resource.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return (view == (LinearLayout)object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        layoutInflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View item_view = layoutInflater.inflate(R.layout.swipe_layout, container, false);
        ImageView imageview = (ImageView) item_view.findViewById(R.id.image_view);
        /*TextView textView = (TextView)  item_view.findViewById(R.id.image_count);*/
        imageview.setImageResource(image_resource[position]);
       /* textView.setText("" + position);*/
        container.addView(item_view);
        return item_view;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((LinearLayout)object);
    }

}

您可以在您体内启动定时任务Fragment。 尚未验证此代码,但它应该可以正常工作。 创建您的滑动任务:

final long delay = 2000;
Handler handler = new Handler();
private int[] pagerIndex = {-1};
private Runnable swipeTask = new Runnable() {
    @Override
    public void run() {

        pagerIndex[0]++;
        if (pagerIndex[0] >= adapter.getCount()) {
            pagerIndex[0] = 0;
        }

        viewPager.setCurrentItem(pagerIndex[0]);
        handler.postDelayed(this, delay);
    }
};

并且在您的片段 onCreateView() 中,在设置 viewPager、适配器等后,

task.run();
Handler h = new Handler();
int delay = 15000; //1 second
Runnable runnable;
private int[] pagerIndex = {-1};
@Override
public void onStart() {


    h.postDelayed(new Runnable() {
        public void run() {
           pagerIndex[0]++;
    if (pagerIndex[0] >= adapter.getCount()) {
        pagerIndex[0] = 0;
    }

    viewPager.setCurrentItem(pagerIndex[0]);
            runnable=this;

            h.postDelayed(runnable, delay);
        }
    }
    , delay);

    super.onStart();
}
private int currentPage = 0;
final long DELAY = 1000;//delay in milliseconds before auto sliding starts.
final long PERIOD = 4000; //time in milliseconds between sliding.

private void autoScroll(){
    final Handler handler = new Handler();
    final Runnable Update = new Runnable() {
        public void run() {
            if (currentPage == YourImageList.size()) {
                currentPage = 0;
            }
            viewPager.setCurrentItem(currentPage++, true);
        }
    };

    timer = new Timer(); // creating a new thread
    timer .schedule(new TimerTask() { // task to be scheduled

        @Override
        public void run() {
            handler.post(Update);
        }
    }, DELAY_MS, PERIOD_MS);
}

Call autoScroll() in onCreateView() of your fragment, after your view pager adapter is set.

viewPager.setAdapter(ViewPagerAdapter)
autoScroll()

If you have to change between fragments, remember to cancel timer in onDetach() method of your fragment as shown below to avoid any issues.

 @Override
public void onDetach() {
    super.onDetach();
    if(timer != null) {
       timer.cancel();
        timer = null;
    }
}

Hope this will help someone. Since I personally experienced an issue with sliding when moving to another fragment and coming back to the same fragment since I had not cancel the timer before moving to another fragment.