Android之View提升:三 使用 StackView 轮播切换多张图片

Android之View提升:三 使用 StackView 轮播切换多张图片,第1张

概述Android之View提升:三使用StackView轮播切换多张图片1.知识点BaseAdapter的继承与使用参考博客adapter是view和数据的桥梁。在一个ListView或者GridView中,你不可能手动给每一个格子都新建一个view,所以这时候就需要Adapter的帮忙,它会帮你自动绘制view并且填充数据。代 AndroID之VIEw提升:三 使用 StackVIEw 轮播切换多张图片1. 知识点BaseAdapter 的继承与使用 参考博客
adapter是vIEw和数据的桥梁。在一个ListVIEw或者GrIDVIEw中,你不可能手动给每一个格子都新建一个vIEw,所以这时候就需要Adapter的帮忙,它会帮你自动绘制vIEw并且填充数据。代码中使用,ImageAdapter继承自BaseAdapter,并且实现它的4个基础方法。
package cn.study.project.stackvIEw;import androID.content.Context;import androID.vIEw.VIEw;import androID.vIEw.VIEwGroup;import androID.Widget.BaseAdapter;import androID.Widget.ImageVIEw;import java.util.List;/** * @author zyy * @date 2021年05月17日 下午9:38 */public class ImageAdapter extends BaseAdapter {    private List<Integer> mList;    private Context mContext;    public ImageAdapter(List<Integer> mList, Context mContext) {        this.mList = mList;        this.mContext = mContext;    }    @OverrIDe    public int getCount() {        return mList.size();    }    @OverrIDe    public Object getItem(int position) {        return mList.get(position);    }    @OverrIDe    public long getItemID(int position) {        return position;    }    @OverrIDe    public VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) {        ImageVIEw imageVIEw=new ImageVIEw(mContext);        imageVIEw.setScaleType(ImageVIEw.ScaleType.CENTER_CROP);        imageVIEw.setimageResource(mList.get(position));        return imageVIEw;    }}
扩充:用BaseAdapter显示一个自定义布局
首先新建一个layout,我命名为item,这个就是我们每个条目要展示的布局
<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"      xmlns:app="http://schemas.androID.com/apk/res-auto"      androID:orIEntation="horizontal" androID:layout_wIDth="match_parent"      androID:layout_height="match_parent">      <ImageVIEw          androID:layout_wIDth="wrap_content"          androID:layout_height="wrap_content"          app:srcCompat="@mipmap/ic_launcher"          androID:ID="@+ID/imageVIEw" />      <button          androID:text="button"          androID:layout_wIDth="wrap_content"          androID:layout_height="wrap_content"          androID:ID="@+ID/button" />      <TextVIEw          androID:text="TextVIEw"          androID:layout_wIDth="wrap_content"          androID:layout_height="wrap_content"          androID:ID="@+ID/textVIEw" /></linearLayout>

接下来修改getVIEw方法,让它显示我们这个item布局

public VIEw getVIEw(int position, VIEw convertVIEw, VIEwGroup parent) {      LayoutInflater inflater = LayoutInflater.from(mContext);      VIEw vIEw = inflater.inflate(R.layout.item,null);      final TextVIEw textVIEw = (TextVIEw) vIEw.findVIEwByID(R.ID.textVIEw);      button button = (button) vIEw.findVIEwByID(R.ID.button);      ImageVIEw imageVIEw = (ImageVIEw) vIEw.findVIEwByID(R.ID.imageVIEw);      imageVIEw.setimageResource(R.mipmap.ic_launcher);      button.setonClickListener(new VIEw.OnClickListener() {          @OverrIDe          public voID onClick(VIEw v) {              textVIEw.append("!");          }      });      textVIEw.setText(data[position]);      return vIEw;}

LayoutInflater是用来加载布局的,用LayoutInflater的inflate方法就可以将你的item布局绘制出来。其中getVIEw方法中的三个参数,position是指现在是第几个条目;convertVIEw是旧视图,就是绘制好了的视图;parent是父级视图,也就是ListVIEw之类的。
用inflate方法绘制好后的vIEw最后return返回给getVIEw方法就可以了。

进阶:每次返回的时候就没有使用convertVIEw,重新创建了一个VIEw,这样子浪费了系统资源。那要怎么利用convertVIEw优化呢?见博客2. 实现

效果:


实现代码:
1.界面布局:

<?xml version="1.0" enCoding="utf-8"?><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:app="http://schemas.androID.com/apk/res-auto"    xmlns:tools="http://schemas.androID.com/tools"    androID:layout_wIDth="match_parent"    androID:layout_height="match_parent"    androID:orIEntation="vertical"    tools:context=".MainActivity">    <linearLayout        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:orIEntation="horizontal">        <button            androID:layout_wIDth="0dp"            androID:layout_height="wrap_content"            androID:layout_weight="1"            androID:ID="@+ID/down"            androID:text="向下轮播"/>        <button            androID:layout_wIDth="0dp"            androID:layout_height="wrap_content"            androID:layout_weight="1"            androID:ID="@+ID/up"            androID:text="向上轮播"/>    </linearLayout>    <StackVIEw        androID:layout_wIDth="match_parent"        androID:layout_height="wrap_content"        androID:loopVIEws="true"        androID:ID="@+ID/stackVIEw"/></linearLayout>
使用:
package cn.study.project.stackvIEw;import androIDx.appcompat.app.AppCompatActivity;import androID.os.Bundle;import androID.vIEw.VIEw;import androID.Widget.AdapterVIEw;import androID.Widget.ImageVIEw;import androID.Widget.StackVIEw;import androID.Widget.Toast;import java.util.ArrayList;import java.util.List;import java.util.Timer;import java.util.TimerTask;public class MainActivity extends AppCompatActivity {    private StackVIEw mStackVIEw;    private int[] myIDs={R.drawable.abc_0,R.drawable.abc_1,R.drawable.abc_2,R.drawable.abc_3};    private List<Integer> myImages=new ArrayList<>();    private Timer mTimerDown;    private Timer mTimerUp;    @OverrIDe    protected voID onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentVIEw(R.layout.activity_main);        mStackVIEw=findVIEwByID(R.ID.stackVIEw);        for (int myID : myIDs) myImages.add(myID);        ImageAdapter adapter=new ImageAdapter(myImages,this);        mStackVIEw.setAdapter(adapter);        mStackVIEw.setonItemClickListener(new AdapterVIEw.OnItemClickListener() {            @OverrIDe            public voID onItemClick(AdapterVIEw<?> parent, VIEw vIEw, int position, long ID) {                Toast.makeText(getApplicationContext(),"eg:"+position,Toast.LENGTH_LONG).show();            }        });        findVIEwByID(R.ID.down).setonClickListener(new VIEw.OnClickListener() {            @OverrIDe            public voID onClick(VIEw v) {                if(mTimerDown!=null) mTimerDown.cancel();                if(mTimerUp!=null) mTimerUp.cancel();                mTimerDown=new Timer();                mTimerDown.schedule(new TimerTask() {                    @OverrIDe                    public voID run() {                        runOnUiThread(new Runnable() {                            @OverrIDe                            public voID run() {                                mStackVIEw.showNext();                            }                        });                    }                },0,1000);            }        });        findVIEwByID(R.ID.up).setonClickListener(new VIEw.OnClickListener() {            @OverrIDe            public voID onClick(VIEw v) {                if(mTimerDown!=null) mTimerDown.cancel();                if(mTimerUp!=null) mTimerUp.cancel();                mTimerUp=new Timer();                mTimerUp.schedule(new TimerTask() {                    @OverrIDe                    public voID run() {                        runOnUiThread(new Runnable() {                            @OverrIDe                            public voID run() {                                mStackVIEw.showPrevIoUs();                            }                        });                    }                },0,1000);            }        });    }}

效果见上。

3. 扩展

可以使用StackVIEw自定义Adapter轮播其他自定义控件。

总结

以上是内存溢出为你收集整理的Android之View提升:三 使用 StackView 轮播切换多张图片全部内容,希望文章能够帮你解决Android之View提升:三 使用 StackView 轮播切换多张图片所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/web/1005090.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存