热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Android实现图片轮播列表

这篇文章主要为大家详细介绍了Android实现图片轮播列表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

这个效果在交友app中比较常见,一般作为首页使用,顶部是一个自动轮播的ViewPager,下面放一个横向LinearLayout,最下面要放一个ListView,但是注意这三个部分都支持滑动,应该和固定在顶部的标题栏和底部的操作栏分开,也就是把ViewPager和LinearLayout以及ListView都放在父控件ScrollView里面

布局文件代码:

<&#63;xml version="1.0" encoding="utf-8"&#63;>



  





  

  

    

    

    

    
  

  



  

    

    

    

    
  

主窗口代码:

public class IndexActivity extends AppCompatActivity implements View.OnClickListener{

  private Context mContext;
  private List mImageList;
  private List mCandidateList;
  private ViewPagerAdapter mPagerAdapter;
  private CandidateListAdapter mListAdapter;

  @SuppressLint("HandlerLeak")
  private Handler handler = new Handler() {

    @Override
    public void handleMessage(Message msg) {
      //每次将当前的位置加1,也就是向右滑动一次
      vp.setCurrentItem(vp.getCurrentItem() + 1);
      //递归无限循环调用
      handler.sendEmptyMessageDelayed(0x123, 2000);
    }
  };

  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_index);
    ButterKnife.bind(this);

    initData();
    initView();
    intListener();
  }

  //初始化数据源,固定写法 1.实例化容器 2.实例化适配器 3.设置适配器
  private void initData() {
    mCOntext= this;
    mImageList = new ArrayList<>();
    mCandidateList = new ArrayList<>();
    mListAdapter = new CandidateListAdapter(mCandidateList);
    mPagerAdapter = new ViewPagerAdapter(mImageList);
    lvfsv.setAdapter(mListAdapter);
    vp.setAdapter(mPagerAdapter);

    getListData(10);
    getPagerData();

    //间隔2秒发送一次信息
    handler.sendEmptyMessageDelayed(0x123, 2000);
  }

  //生成ViewPager数据源
  private void getPagerData() {
    mImageList.add(R.drawable.bm1);
    mImageList.add(R.drawable.bm2);
    mImageList.add(R.drawable.bm3);
    mImageList.add(R.drawable.bm4);
    mImageList.add(R.drawable.bm5);
    mImageList.add(R.drawable.bm6);

    mPagerAdapter.notifyDataSetChanged();
    //初始的位置在正中间
    vp.setCurrentItem(mPagerAdapter.getCount() / 2);
  }

  //生成ListView数据源
  private void getListData(int num) {
    for (int i = 0; i  {
      Toast.makeText(mContext, "position: " + position, Toast.LENGTH_SHORT).show();
    });

    lvfsv.setOnItemClickListener((parent, view, position, id) -> {
      Toast.makeText(mContext, "position: " + position, Toast.LENGTH_SHORT).show();
    });

    for (int i = 0; i <4; i++) {
      ivs.getChildAt(i).setOnClickListener(this);
    }
  }

  @Override
  public void onClick(View v) {

    switch (v.getId()){
      case R.id.iv1:
      case R.id.iv2:
      case R.id.iv3:
      case R.id.iv4:
        Toast.makeText(mContext, "此处跳转", Toast.LENGTH_SHORT).show();
    }
  }
}

ListView需要覆盖onMeasure方法,代码如下:

public class ListViewForScrollView extends ListView {
  public ListViewForScrollView(Context context) {
    super(context);
  }
  public ListViewForScrollView(Context context, AttributeSet attrs) {
    super(context, attrs);
  }
  public ListViewForScrollView(Context context, AttributeSet attrs,
    int defStyle) {
    super(context, attrs, defStyle);
  }
  @Override
  /**
   * 重写该方法,达到使ListView适应ScrollView的效果
   */
  protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int expandSpec = MeasureSpec.makeMeasureSpec(Integer.MAX_VALUE >> 2,
    MeasureSpec.AT_MOST);
    super.onMeasure(widthMeasureSpec, expandSpec);
  }
}

ViewPager适配器代码:

public class ViewPagerAdapter extends PagerAdapter implements View.OnClickListener {

  //图片的资源id列表
  private List mList;
  private Callback mCallback;

  public ViewPagerAdapter(List mList) {
    this.mList = mList;
  }

  public void setmCallback(Callback mCallback) {
    this.mCallback = mCallback;
  }

  public interface Callback {
    void onClick(View v, int position);
  }

  @Override
  //将适配器中的数据设为无穷大
  public int getCount() {
    return Integer.MAX_VALUE;
  }

  @Override
  //固定写法,不覆盖会报错
  public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
    container.removeView((View) object);
  }

  @Override
  //固定写法
  public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
    return view == object;
  }

  @NonNull
  @Override
  public Object instantiateItem(@NonNull ViewGroup container, int position) {
    LayoutInflater inflater = LayoutInflater.from(container.getContext());
    ImageView imageView = (ImageView) inflater.inflate(R.layout.item_image_pager, null);

    //将position转换成余数
    int realPosition = position % mList.size();
    imageView.setImageResource(mList.get(realPosition));
    imageView.setOnClickListener(this);
    //tag放跳转需要的数据
    imageView.setTag(realPosition);
    //将实例加入父控件
    container.addView(imageView);
    return imageView;
  }

  @Override
  //使用接口将position回传
  public void onClick(View v) {
    mCallback.onClick(v, (int) v.getTag());
  }
}

大功告成,实现效果如下:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


推荐阅读
  • 如何高效学习鸿蒙操作系统:开发者指南
    本文探讨了开发者如何更有效地学习鸿蒙操作系统,提供了来自行业专家的建议,包括系统化学习方法、职业规划建议以及具体的开发技巧。 ... [详细]
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • Android 中的布局方式之线性布局
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 处理Android EditText中数字输入与parseInt方法
    本文探讨了如何在Android应用中从EditText组件安全地获取并解析用户输入的数字,特别是用于设置端口号的情况。通过示例代码和异常处理策略,展示了有效的方法来避免因非法输入导致的应用崩溃。 ... [详细]
  • 使用TabActivity实现Android顶部选项卡功能
    本文介绍如何通过继承TabActivity来创建Android应用中的顶部选项卡。通过简单的步骤,您可以轻松地添加多个选项卡,并实现基本的界面切换功能。 ... [详细]
  • Android与JUnit集成测试实践
    本文探讨了如何在Android项目中集成JUnit进行单元测试,并详细介绍了修改AndroidManifest.xml文件以支持测试的方法。 ... [详细]
  • 在尝试使用 Android 发送 SOAP 请求时遇到错误,服务器返回 '无法处理请求' 的信息,并指出某个值不能为 null。本文探讨了可能的原因及解决方案。 ... [详细]
  • 春季职场跃迁指南:如何高效利用金三银四跳槽季
    随着每年的‘金三银四’跳槽高峰期的到来,许多职场人士都开始考虑是否应该寻找新的职业机会。本文将探讨如何制定有效的职业规划、撰写吸引人的简历以及掌握面试技巧,助您在这关键时期成功实现职场跃迁。 ... [详细]
  • 吴石访谈:腾讯安全科恩实验室如何引领物联网安全研究
    腾讯安全科恩实验室曾两次成功破解特斯拉自动驾驶系统,并远程控制汽车,展示了其在汽车安全领域的强大实力。近日,该实验室负责人吴石接受了InfoQ的专访,详细介绍了团队未来的重点方向——物联网安全。 ... [详细]
  • 本文探讨了使用普通生成函数和指数生成函数解决组合与排列问题的方法,特别是在处理特定路径计数问题时的应用。文章通过详细分析和代码实现,展示了如何高效地计算在给定条件下不相邻相同元素的排列数量。 ... [详细]
  • 本文探讨了如何在Docker构建过程中使用动态环境变量,特别是针对Docker v1.9及以上版本的用户。我们将介绍如何声明和使用构建参数,以及这些参数对构建缓存的影响。 ... [详细]
  • 本文提供了一种有效的方法来解决当Android Studio因电脑意外重启而导致的所有import语句出现错误的问题。通过清除缓存和重建项目结构,可以快速恢复开发环境。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 从理想主义者的内心深处萌发的技术信仰,推动了云原生技术在全球范围内的快速发展。本文将带你深入了解阿里巴巴在开源领域的贡献与成就。 ... [详细]
author-avatar
只属于天天的牛牛
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有