getView(int position, View convertView, ViewGroup parent)

本文深入解析了Android开发中ListView的缓冲机制,阐述了如何通过复用视图提高性能,包括item视图的回收与再利用过程,以及getView方法中position、convertView和parent参数的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android开发

向上滑动 ListView ,item1 视图被滑出屏幕, item1视图被 回收到 Recycler( View 缓冲池) 中,如要显示 item8视图,先从缓存池中取出item1视图,更新 item8 需要显示的数据,变成了item8视图,把它放到ViewGroup中,ListView要的时候取出来。

ListView 的缓冲机制:需要时才显示,显示完就被会收到缓存。

在这里插入图片描述

public View getView(int position, View convertView, ViewGroup parent)

position:
The position of the item within the adapter’s data set of the item whose view we want.
显示屏中,要出现的一行搜索结果(一个item.xml形成的视图),其在搜索结果中的位置

convertView:
The old view(item的,每一行的视图) to reuse, if possible. Note: You should check that this view is non-null and of an appropriate type before using. If it is not possible to convert this view to display the correct data, this method can create a new view.
随着滑动,屏幕中消失的一行被回收到了缓存, 将其(convertVeiw)取出,在其视图中,更改控件信息(把将要显示的那一行的控件信息填进去),形成了新的即将在ListView中出现的item视图。
如果缓存中没有,要新建视图 convertView = myInflater.inflate(R.layout.item, null);//布局实例化

parent:
The parent that this view will eventually be attached to return A View corresponding to the data at the specified position.
每个item的视图,被放在了parent中,listeview要显示新出现的一行的视图时,把其取出来(把item1视图更改为item8视图后,也把它放到parent)

package com.example.kucun2.function; import static android.content.ContentValues.TAG; import android.content.Context; import android.util.Log; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; import android.widget.Spinner; import android.widget.TextView; import androidx.annotation.NonNull; import com.example.kucun2.entity.Bancai; import com.example.kucun2.entity.Caizhi; import com.example.kucun2.entity.Chanpin; import com.example.kucun2.entity.Dingdan; import com.example.kucun2.entity.Mupi; import com.example.kucun2.entity.Zujian; import com.example.kucun2.entity.data.Data; import java.util.List; public class Adapter { // 1. 更新材质适配器(材质显示只输出name) public static ArrayAdapter<Caizhi> setupCaizhiSpinner(Spinner spinnerCaizhi, List<Caizhi> data, Context context) { ArrayAdapter<Caizhi> caizhiAdapter = new ArrayAdapter<Caizhi>( context, android.R.layout.simple_spinner_item, data) { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Caizhi caizhi = getItem(position); textView.setText(caizhi != null ? caizhi.getName() : "请选择材质"); return view; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Caizhi caizhi = getItem(position); textView.setText(caizhi != null ? caizhi.getName() : ""); return textView; } }; caizhiAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerCaizhi.setAdapter(caizhiAdapter); return caizhiAdapter; } // 2. 更新木皮适配器(木皮输出name + 油或不加) public static void setupMupiSpinner(Spinner spinnerMupi, List<Mupi> data,Context context) { ArrayAdapter<Mupi> mupiAdapter = new ArrayAdapter<Mupi>( context, android.R.layout.simple_spinner_item, data) { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Mupi mupi = getItem(position); textView.setText(mupi != null ? mupi.formatMupiDisplay() : "请选择木皮"); return textView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Mupi mupi = getItem(position); textView.setText(mupi != null ? mupi.formatMupiDisplay() : ""); return textView; } }; mupiAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerMupi.setAdapter(mupiAdapter); } // 2. 更新木皮适配器(板材输出TableText) public static void setupBancaiSpinners(Spinner spinnerBancai, List<Bancai> data, Context context) { ArrayAdapter<Bancai> mupiAdapter = new ArrayAdapter<Bancai>( context, android.R.layout.simple_spinner_item, data) { @Override public View getView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Bancai bancai = getItem(position); textView.setText(bancai != null ? bancai.TableText() : "请选择板材"); return textView; } @Override public View getDropDownView(int position, View convertView, ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Bancai bancai = getItem(position); textView.setText(bancai != null ? bancai.TableText() : ""); return textView; } }; mupiAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerBancai.setAdapter(mupiAdapter); } public static void setupDingdanSpinner(Spinner spinnerDingdan, List<Dingdan> data, Context context) { // 定制订单适配器显示订单号(number) ArrayAdapter<Dingdan> dingdanAdapter = new ArrayAdapter<Dingdan>( context, android.R.layout.simple_spinner_item, data) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Dingdan dingdan = getItem(position); textView.setText(dingdan != null ? dingdan.getNumber() : "请选择"); return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Dingdan dingdan = getItem(position); textView.setText(dingdan != null ? dingdan.getNumber() : "请选择"); return textView; } }; dingdanAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerDingdan.setAdapter(dingdanAdapter); } public static void setupChanpinSpinner(Spinner spinnerChanpin, List<Chanpin> data, Context context) { // 定制订单适配器显示订单号(number) ArrayAdapter<Chanpin> ChanpinAdapter = new ArrayAdapter<Chanpin>( context, android.R.layout.simple_spinner_item, data) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Chanpin chanpin = getItem(position); textView.setText(chanpin != null ? chanpin.getBianhao() : "请选择"); return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Chanpin chanpin = getItem(position); textView.setText(chanpin != null ? chanpin.getBianhao() : "请选择"); return textView; } }; ChanpinAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerChanpin.setAdapter(ChanpinAdapter); } // 定制组件适配器显示组件名(name) public static void setupZujianSpinner(Spinner spinnerZujian, List<Zujian> data, Context context) { ArrayAdapter<Zujian> zujianAdapter = new ArrayAdapter<Zujian>( context, android.R.layout.simple_spinner_item, data) { @NonNull @Override public View getView(int position, View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Zujian zujian = getItem(position); textView.setText(zujian != null ? zujian.getName() : "请选择"); return textView; } @Override public View getDropDownView(int position, View convertView, @NonNull ViewGroup parent) { View view = super.getView(position, convertView, parent); TextView textView = view.findViewById(android.R.id.text1); Zujian zujian = getItem(position); textView.setText(zujian != null ? zujian.getName() : "请选择"); return textView; } }; zujianAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spinnerZujian.setAdapter(zujianAdapter); } } mple.kucun2 E FATAL EXCEPTION: main Process: com.example.kucun2, PID: 12408 java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.Object.toString()' on a null object reference at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:454) at android.widget.ArrayAdapter.getView(ArrayAdapter.java:416) at com.example.kucun2.function.Adapter$5.getView(Adapter.java:166) at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:206) at android.widget.Spinner.onMeasure(Spinner.java:622) at androidx.appcompat.widget.AppCompatSpinner.onMeasure(AppCompatSpinner.java:444) at android.view.View.measure(View.java:29007) at android.widget.LinearLayout.measureHorizontal(LinearLayout.java:1226) at android.widget.LinearLayout.onMeasure(LinearLayout.java:728) at android.view.View.measure(View.java:29007) at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:7132) at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java
06-13
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值