java holder_java – 为什么在ViewHolder模式中ViewHolder类应该是静态的?

使用静态内部类的一个好处是,可以从静态方法访问内部类,而不需要外部类的实例。

如果内部类非静态:

class MyOuter {

private int x = 7;

public void makeInner() {

MyInner in = new MyInner();

in.seeOuter();

}

class MyInner {

public void seeOuter() {

System.out.println("Outer x is " + x);

}

}

}

public static void main(String[] args) {

MyOuter mo = new MyOuter();

MyOuter.MyInner inner = mo.new MyInner();

inner.seeOuter();

}

如果内部类是静态的:

class BigOuter {

static class Nest {void go() { System.out.println("hi"); } }

}

class Broom {

static class B2 {void goB2() { System.out.println("hi 2"); } }

public static void main(String[] args) {

BigOuter.Nest n = new BigOuter.Nest();

n.go();

B2 b2 = new B2();

b2.goB2();

}

}

ViewHolder是一种常见的设计模式,主要用于优化ListView、RecyclerView等列表型控件的性能。在ListView等控件,每个Item都会被转化为一个View对象,并在屏幕上渲染显示。当列表项很多时,每次滚动屏幕都需要重新创建和渲染View对象,这会导致性能问题。 ViewHolder模式通过将ListView每个Item的子View对象缓存起来,避免了重复创建和销毁View对象的过程。ViewHolder对象保存了每个ItemView对象的引用,这些View对象可以被复用。当需要显示一个新的Item时,只需要更新ViewHolder对应的View对象的数据,而不需要重新创建View对象。 ViewHolder模式的具体实现方法是,在getView()方法使用convertView参数复用已经创建的View对象,同时使用setTag()方法将ViewHolder对象与convertView对象关联起来,代码示例如下: ``` @Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder holder; if (convertView == null) { convertView = LayoutInflater.from(context).inflate(R.layout.item_layout, parent, false); holder = new ViewHolder(); holder.textView = convertView.findViewById(R.id.textview); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } // 更新ViewHolderView对象的数据 holder.textView.setText(data.get(position).getName()); return convertView; } ``` 在上面的代码ViewHolder是一个静态内部,它保存了ListView每个Item需要显示的View对象的引用,这里只有一个TextView;convertView参数用于复用已经创建的View对象,如果convertView不为null,表示可以复用已经创建的View对象,这里的convertView实际上就是ViewHolder保存的View对象;setTag()方法将ViewHolder对象与convertView对象关联起来,以便在下次使用时可以通过convertView.getTag()方法获取ViewHolder对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值