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方法就可以了。
效果:
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 轮播切换多张图片所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)