zoukankan      html  css  js  c++  java
  • ListView展示不同布局需要注意的地方

    尊重劳动成果,转载请标明出处:http://www.cnblogs.com/tangZH/p/8419010.html 

    我们在项目中经常需在一个listview中展示不一样的布局,我们可以在adapter的getView()中根据position来决定该展示哪些布局。

    我在项目中便是如此,第一个item是展示一张图片(判断当position==0的时候返回该图片),而当position不为0的时候返回我们需要的布局,如下:

     ViewHolder viewHolder = new ViewHolder();
            if (view == null) {
                view = mInflater.inflate(R.layout.listview_item, viewGroup, false);
                viewHolder.textCate = view.findViewById(R.id.discover_text_category);
                viewHolder.textView = view.findViewById(R.id.discover_view_all);
                viewHolder.arrow = view.findViewById(R.id.discover_arrow);
                viewHolder.divider = view.findViewById(R.id.discover_item_divider);
                view.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) view.getTag();
            }

    //下面这里执行相应的操作,举一个例子
    viewHolder.textCate.setText("A")
     

    可是这时候问题来了,滑动到下面的时候报错:找不到组件textCate

    苦思良久,最终我是这样分析的:

    listView的item会复用,也就是滑动到下面的时候,下面的item会复用第一个item,也就是图片,然后代码在判断view == null的时候不成立,于是执行

    viewHolder = (ViewHolder) view.getTag();

    而我们没有给图片设置tag,取出来的当然为空,因此下面会报空指针。

    有什么觉方法呢?

    其实很简单,只要在判断view == null后面再加上一个判断就行了:

    if (view == null || view.getTag() == null)

    当view为null或者view取出来的tag也为null的时候,那就需要去重新加载布局,设置tag

  • 相关阅读:
    理解vue数据驱动
    深入理解vue的watch
    Vue如何用虚拟dom进行渲染view的
    小程序开发-自定义组件的扩展
    让微信小程序页面之间的通信不在变得困难
    借鉴redux,实现一个react状态管理方案
    Vue的computed计算属性是如何实现的
    读redux有感: redux原来是这样操作的。
    web前端面试题记录
    前端知识理解的笔记
  • 原文地址:https://www.cnblogs.com/tangZH/p/8419010.html
Copyright © 2011-2022 走看看