ViewPager无限轮播+手动滑动+AsyncTask异步交互机制实例

我们来讲一个Viewpager无线轮播的实例,这个实例中用到了手动滑动,以及AsyncTask异步交互机制

首先是自动轮播匹配的小圆点的文件,放在drawable中,我们为选中的小圆点文件取名为dot_focus

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >
    <corners android:radius="8dp"/>
    <solid android:color="#59b536"/>

</shape>

未选中状态小圆点文件 dot_normal

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

<corners android:radius="8dp"/>
    <solid android:color="#c2c2c2"/>
</shape>

接下来是布局

主页面布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="160dp" >

        <android.support.v4.view.ViewPager
            android:id="@+id/main_vp"
            android:layout_width="match_parent"
            android:layout_height="160dp" />

        <LinearLayout
            android:id="@+id/main_dots_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:layout_alignBottom="@id/main_vp"
            android:orientation="horizontal" >
        </LinearLayout>
    </RelativeLayout>
    <TableRow 
        android:layout_width="match_parent"
        android:layout_height="40dp"
        android:orientation="horizontal"
        android:layout_marginTop="3dp"
        >
        <Button 
            android:id="@+id/main_bt_one"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#666666"
            android:layout_weight="1"
            android:text="默认"
            />
        <View 
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#cccccc"
            />
        <Button 
            android:id="@+id/main_bt_two"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#eaeaea"
            android:layout_weight="1"
            android:text="销量"
            />
        <View 
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#cccccc"
            />
        <Button 
            android:id="@+id/main_bt_three"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#eaeaea"
            android:layout_weight="1"
            android:text="信誉"
            />
        <View 
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#cccccc"
            />
        <Button 
            android:id="@+id/main_bt_four"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:background="#eaeaea"
            android:layout_weight="1"
            android:text="价格"
            />
        <View 
            android:layout_width="0.5dp"
            android:layout_height="match_parent"
            android:background="#cccccc"
            />
    </TableRow>
    <View 
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="#cccccc"
        />
    <ListView 
        android:id="@+id/main_lv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />

</LinearLayout>

listview的信息匹配页面 main_lv_item

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

    <TableRow
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:gravity="center_vertical"
        android:background="#fff"
        android:orientation="horizontal" >

        <ImageView
            android:id="@+id/main_lv_item_iv"
            android:layout_width="100dp"
            android:layout_height="120dp"
            android:src="@drawable/ic_launcher" />

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="120dp"
            android:layout_marginLeft="5dp"
            android:orientation="vertical" >
            <TextView 
                android:id="@+id/main_lv_item_tv_title"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:textSize="16sp"
                android:text="标题"
                />
            <TextView 
                android:id="@+id/main_lv_item_tv_brand"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"

                android:textSize="16sp"
                android:text="品牌"
                />
            <TextView 
                android:id="@+id/main_lv_item_tv_xiao"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_marginTop="5dp"
                android:textSize="16sp"
                android:text="销量"
                />
            <RelativeLayout 
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_marginTop="10dp"
                >
            <TextView 
                android:id="@+id/main_lv_item_tv_price"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textColor="#f00"
                android:textSize="14sp"
                android:text="价格"
                />

            <TextView
                android:id="@+id/main_lv_item_tv_good"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentRight="true"
                android:layout_alignParentTop="true"
                android:layout_marginRight="14dp"
                android:text="好评"
                android:textSize="14sp" />

            </RelativeLayout>
        </LinearLayout>
    </TableRow>
    <View 
        android:layout_width="match_parent"
        android:layout_height="0.5dp"
        android:background="#ccc"
        />

</LinearLayout>

我们这里单独写一个imageloader工具类 ImageLoadUtils,存放加载图片的方法

public class ImageLoadUtils {

    /*
     * 初始化ImageLoad配置信息 
     * (注意在application中初始化这样 就会保证程序一运行就会初始化配置)
     */

    public static void initConfiguation(Context context){
        //获取配置对象
        Builder configuation = new ImageLoaderConfiguration.Builder(context);
        //设置内存的缓存的图片大小
        configuation.memoryCacheExtraOptions(400, 800)
        //设置缓存进磁盘的图片大小
        .diskCacheExtraOptions(400, 800, null)
        .writeDebugLogs();

        //获取ImageLoader实例初始化环境信息
        ImageLoader.getInstance().init(configuation.build());
    }

    /*
     * 初始化视图选项
     */

    public static DisplayImageOptions initOptions(){
        DisplayImageOptions options = new DisplayImageOptions.Builder()
        //图片加载是显示的图片
        .showImageOnLoading(R.drawable.ic_launcher)
        //图片加载失败时显示的图片
        .showImageOnFail(R.drawable.ic_launcher)
        //是否缓存进内存
        .cacheInMemory(true)
        //是否缓存进sd卡
        .cacheOnDisk(true)
        .build();
        return options;
    }
}

写一个MyApplication第三方实现类

public class MyApplication extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        // 初始化ImageLoader并传入全局上下文
        ImageLoadUtils.initConfiguation(getApplicationContext());
    }
}

我们接下来写一下listview适配器类MyAdapter和iewpager适配器类MyPagerAdapter

public class MyAdapter extends BaseAdapter{

    private  Context context;
    private DisplayImageOptions options;
    private List<MyItem> list;

    public MyAdapter(Context context,DisplayImageOptions options, List<MyItem> list) {
        super();
        this.context = context;
        this.options = options;
        this.list = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = View.inflate(context, R.layout.main_lv_item, null);
            holder = new ViewHolder();
            //找控件
            holder.iv = (ImageView) convertView.findViewById(R.id.main_lv_item_iv);
            holder.title = (TextView) convertView.findViewById(R.id.main_lv_item_tv_title);
            holder.brand = (TextView)convertView.findViewById(R.id.main_lv_item_tv_brand);
            holder.xiao = (TextView)convertView.findViewById(R.id.main_lv_item_tv_xiao);
            holder.price = (TextView)convertView.findViewById(R.id.main_lv_item_tv_price);
            holder.good = (TextView)convertView.findViewById(R.id.main_lv_item_tv_good);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        ImageLoader.getInstance().displayImage(list.get(position).img, holder.iv, options);
        holder.title.setText(list.get(position).title);
        holder.brand.setText("品牌:"+list.get(position).brand);
        holder.xiao.setText("销量:"+list.get(position).salesVolume);
        holder.price.setText("¥:"+list.get(position).price);
        holder.good.setText("好评:"+list.get(position).good);
        return convertView;
    }

    class ViewHolder{
        ImageView iv;
        TextView title;
        TextView brand;
        TextView xiao;
        TextView price;
        TextView good;

    }

}
public class MyAdapter extends BaseAdapter{

    private  Context context;
    private DisplayImageOptions options;
    private List<MyItem> list;

    public MyAdapter(Context context,DisplayImageOptions options, List<MyItem> list) {
        super();
        this.context = context;
        this.options = options;
        this.list = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if(convertView == null){
            convertView = View.inflate(context, R.layout.main_lv_item, null);
            holder = new ViewHolder();
            //找控件
            holder.iv = (ImageView) convertView.findViewById(R.id.main_lv_item_iv);
            holder.title = (TextView) convertView.findViewById(R.id.main_lv_item_tv_title);
            holder.brand = (TextView)convertView.findViewById(R.id.main_lv_item_tv_brand);
            holder.xiao = (TextView)convertView.findViewById(R.id.main_lv_item_tv_xiao);
            holder.price = (TextView)convertView.findViewById(R.id.main_lv_item_tv_price);
            holder.good = (TextView)convertView.findViewById(R.id.main_lv_item_tv_good);
            convertView.setTag(holder);
        }else{
            holder = (ViewHolder) convertView.getTag();
        }

        ImageLoader.getInstance().displayImage(list.get(position).img, holder.iv, options);
        holder.title.setText(list.get(position).title);
        holder.brand.setText("品牌:"+list.get(position).brand);
        holder.xiao.setText("销量:"+list.get(position).salesVolume);
        holder.price.setText("¥:"+list.get(position).price);
        holder.good.setText("好评:"+list.get(position).good);
        return convertView;
    }

    class ViewHolder{
        ImageView iv;
        TextView title;
        TextView brand;
        TextView xiao;
        TextView price;
        TextView good;

    }

}

接下来是我们通过这个网址解析到的json数据得到的bean类,这里应该写在工具类之前,原谅我这里疏忽了

public class Bean {

    public List<MyItem> item;
    public class MyItem{
        public String brand;
        public String good;
        public String img;
        public String salesVolume;
        public String price;
        public String title;
    }
}

最后使我们的MainActivity的编写

public class MainActivity extends Activity implements OnClickListener {

    private ViewPager main_vp;
    private Button main_bt_one;
    private Button main_bt_two;
    private Button main_bt_three;
    private Button main_bt_four;
    private ListView main_lv;
    private List<ImageView> dotsLlist;
    private LinearLayout dots_layout;
    private List<MyItem> vpimag = new ArrayList<MyItem>();
    private List<MyItem> listmr = new ArrayList<MyItem>();
    private List<MyItem> listxl = new ArrayList<MyItem>();
    private List<MyItem> listxy = new ArrayList<MyItem>();
    private List<MyItem> listjg = new ArrayList<MyItem>();
    private DisplayImageOptions options;

    Handler handler = new Handler() {
        public void handleMessage(android.os.Message msg) {
            if (msg.what == 1) {
                int currentItem = main_vp.getCurrentItem();
                currentItem++;
                main_vp.setCurrentItem(currentItem);
                handler.sendEmptyMessageDelayed(1, 3000);
            }
        };
    };
    private MyAdapter adapter;
    private Button[] bts;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //请求去掉窗口title
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_main);
        // 初始化ImageImageLoader
        options = ImageLoadUtils.initOptions();
        // 找控件
        findComp();
        // 初始化小圆点
        initDots();
        // 执行异步请求
        MyAsyncTask task = new MyAsyncTask();
        task.execute("http://172.17.29.120/localuser/ljy/shoptest/commodity.json");
    }

    /*
     * 初始化小圆点的方法
     */
    private void initDots() {
        // 创建存储小圆点控件的集合
        dotsLlist = new ArrayList<ImageView>();
        // 在存储集合之前需要清除信息
        dotsLlist.clear();
        dots_layout.removeAllViews();
        for (int i = 0; i < 3; i++) {
            ImageView img = new ImageView(this);
            if (i == 0) {
                img.setImageResource(R.drawable.dots_focus);
            } else {
                img.setImageResource(R.drawable.dots_normal);
            }
            dotsLlist.add(img);
            LayoutParams params = new LayoutParams(16, 16);
            params.setMargins(8, 0, 8, 0);
            dots_layout.addView(img, params);
        }
    }

    /*
     * 所需控件
     */
    private void findComp() {
        main_vp = (ViewPager) findViewById(R.id.main_vp);
        dots_layout = (LinearLayout) findViewById(R.id.main_dots_layout);
        main_bt_one = (Button) findViewById(R.id.main_bt_one);
        main_bt_two = (Button) findViewById(R.id.main_bt_two);
        main_bt_three = (Button) findViewById(R.id.main_bt_three);
        main_bt_four = (Button) findViewById(R.id.main_bt_four);
        main_lv = (ListView) findViewById(R.id.main_lv);

        bts = new Button[] {main_bt_one,main_bt_two,main_bt_three,main_bt_four};
        // 设置四个按钮的监听并实现onClickListener接口
        main_bt_one.setOnClickListener(this);
        main_bt_two.setOnClickListener(this);
        main_bt_three.setOnClickListener(this);
        main_bt_four.setOnClickListener(this);
    }

    // 创建异步请求列
    class MyAsyncTask extends AsyncTask<String, Void, Bean[]> {

        @Override
        protected Bean[] doInBackground(String... params) {
            Bean[] bean = getNetData(params[0]);
            return bean;
        }

        @Override
        protected void onPostExecute(Bean[] result) {
            super.onPostExecute(result);
            // 设置数据的分配
            setData(result);
        }

        /*
         * 数据分配与设置适配器器的方法
         */
        private void setData(Bean[] result) {
            // 清除集合数据
            vpimag.clear();
            listjg.clear();
            listmr.clear();
            listxl.clear();
            listxy.clear();
            // 获取对应数据
            List<MyItem> img = result[0].item;
            List<MyItem> mr = result[1].item;
            List<MyItem> xl = result[2].item;
            List<MyItem> xy = result[3].item;
            List<MyItem> jg = result[4].item;
            // 将解析的数据存储到对应成员集和
            vpimag = img;
            listmr = mr;
            listxl = xl;
            listxy = xy;
            listjg = jg;
            // 为viewpager设置适配器
            MyPagerAdapter myPagerAdapter = new MyPagerAdapter(
                    MainActivity.this, vpimag, options);
            main_vp.setAdapter(myPagerAdapter);

            // 为ListView设置适配器
            setListAdapter(listmr);

            // 设置viewpager的监听
            setpagerlistener();
            handler.sendEmptyMessageDelayed(1, 3000);
        }

        /*
         * viewpager的监听方法
         */
        private void setpagerlistener() {
            main_vp.setOnPageChangeListener(new OnPageChangeListener() {

                @Override
                public void onPageSelected(int arg0) {
                    for (int i = 0; i < dotsLlist.size(); i++) {
                        if (i == arg0 % dotsLlist.size()) {
                            dotsLlist.get(i).setImageResource(
                                    R.drawable.dots_focus);
                        } else {
                            dotsLlist.get(i).setImageResource(
                                    R.drawable.dots_normal);
                        }
                    }
                }

                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    // TODO Auto-generated method stub

                }

                @Override
                public void onPageScrollStateChanged(int arg0) {
                    // TODO Auto-generated method stub

                }
            });
        }

    }

    // 创建重网络获取数据的方法
    public Bean[] getNetData(String path) {
        try {
            HttpClient client = new DefaultHttpClient();
            // 执行请求
            HttpResponse response = client.execute(new HttpGet(path));
            int statusCode = response.getStatusLine().getStatusCode();
            if (statusCode == 200) {
                InputStream in = response.getEntity().getContent();
                int len = 0;
                byte[] b = new byte[1024];
                ByteArrayOutputStream baos = new ByteArrayOutputStream();
                while ((len = in.read(b)) != -1) {
                    baos.write(b, 0, len);
                }
                String json = baos.toString("GBK");
                // Log.i("HOME", "json:"+json);
                Gson gson = new Gson();
                Bean[] bean = gson.fromJson(json, Bean[].class);
                return bean;
            }else{
                Toast.makeText(MainActivity.this, "服务器连接失败!", 0).show();
            }
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 在这里创建适配器方法供按钮调用
     */
    public void setListAdapter(List<MyItem> item) {
        adapter = new MyAdapter(MainActivity.this, options, item);
        main_lv.setAdapter(adapter);
    }

    /*
     * 改变按钮北京的按钮
     * 其中颜色在values文件的styles中配置
     */
    public void updateColor(int arg){
        for (int i = 0; i < bts.length; i++) {
            if(i == arg){
                bts[i].setBackgroundResource(R.color.bt_focus);
            }else{
                bts[i].setBackgroundResource(R.color.bt_normal);
            }
        }
    }

    // 重写按钮的点击方法
    @Override
    public void onClick(View v) {
        // 获取点击按钮的id
        int id = v.getId();
        switch (id) {
        case R.id.main_bt_one:
            setListAdapter(listmr);
            updateColor(0);
            break;

        case R.id.main_bt_two:
            updateColor(1);
            setListAdapter(listxl);
            break;

        case R.id.main_bt_three:
            updateColor(2);
            setListAdapter(listxy);
            break;

        case R.id.main_bt_four:
            updateColor(3);
            setListAdapter(listjg);
            break;
        }
    }

}

以上所有就是我的关于viewpager的无限轮播的简单实例,希望可以帮到大家

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值