Android 定制阵列适配器&x2B;ListView中,某些行未正确处理
这篇文章将大量刊登图片 我已经创建了一个自定义ArrayAdapter,并在Listview上使用它。适配器上有什么东西漏了吗Android 定制阵列适配器&x2B;ListView中,某些行未正确处理,android,listview,android-arrayadapter,Android,Listview,Android Arrayadapter,这篇文章将大量刊登图片 我已经创建了一个自定义ArrayAdapter,并在Listview上使用它。适配器上有什么东西漏了吗 @Override public View getView(int position, View convertView, ViewGroup parent) { View row = convertView; ArrayHolder holder = null; if(row == null) {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ArrayHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ArrayHolder();
holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
row.setTag(holder);
}
else
{
if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
else{row.setBackgroundColor(Color.BLACK);}
Typeface font1 =Typeface.createFromAsset(context.getAssets(),"fonts/kingrich.ttf");
((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));
holder = (ArrayHolder)row.getTag();
}
String array = data.get(position);
holder.txtTitle.setText(array);
return row;
}
首次启动应用程序时,将显示以下屏幕:
(屏幕构成实际设备,而不是模拟器)
现在,如果我用后退按钮关闭虚拟键盘,当我向下滚动一点时,在底部我已经可以看到一行的颜色不正确:
如果我上下滚动,该行将获得正确的颜色
提前感谢不要将剩余代码放在if的else部分(row==null): textView txtTitle没有着色,因为else块被跳过,因为listview没有可循环使用的视图
当您向上/向下滚动时,视图的循环开始了,您可以转到其他部分。最好完全删除sle部分,因为无论convertview是否为null,您都希望文本视图着色。不要将剩余代码放在if的else部分(row==null): textView txtTitle没有着色,因为else块被跳过,因为listview没有可循环使用的视图
当您向上/向下滚动时,视图的循环开始了,您可以转到其他部分。最好完全删除sle部分,因为无论convertview是否为null,您都希望文本视图被着色。在我看来,您没有正确处理新视图的创建 文本显示为白色,这表明跳过了else块(因此convertView参数为null,或者没有要回收的视图(这是公平的,因为当软键盘消失时,您会看到更多视图) 该行在上/下滚动后正确上色,因为您现在有视图要回收,因此将进入else块 Imho您应该完全删除else关键字。 这样,您将仅在实际需要时输入if(创建新视图的位置),否则,即使视图是新的且未回收,您也将始终使用正确的颜色 试试看,告诉我它是否有效
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ArrayHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ArrayHolder();
holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
row.setTag(holder);
}
//this part must be executed every time, not only for recycled views
if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
else{row.setBackgroundColor(Color.BLACK);}
Typeface font1 = Typeface.createFromAsset(context.getAssets(), "fonts/kingrich.ttf");
((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));
holder = (ArrayHolder)row.getTag();
String array = data.get(position);
holder.txtTitle.setText(array);
return row;
}
在我看来,您没有正确处理新视图的创建 文本显示为白色,这表明跳过了else块(因此convertView参数为null,或者没有要回收的视图(这是公平的,因为当软键盘消失时,您会看到更多视图) 该行在上/下滚动后正确上色,因为您现在有视图要回收,因此将进入else块 Imho您应该完全删除else关键字。 这样,您将仅在实际需要时输入if(创建新视图的位置),否则,即使视图是新的且未回收,您也将始终使用正确的颜色 试试看,告诉我它是否有效
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
ArrayHolder holder = null;
if(row == null)
{
LayoutInflater inflater = ((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
holder = new ArrayHolder();
holder.txtTitle = (TextView)row.findViewById(R.id.txtTitle);
row.setTag(holder);
}
//this part must be executed every time, not only for recycled views
if(position % 2 == 0){row.setBackgroundColor(Color.DKGRAY);}
else{row.setBackgroundColor(Color.BLACK);}
Typeface font1 = Typeface.createFromAsset(context.getAssets(), "fonts/kingrich.ttf");
((TextView)row.findViewById(R.id.txtTitle)).setTypeface(font1);
((TextView)row.findViewById(R.id.txtTitle)).setTextColor(Color.rgb(153, 255, 102));
holder = (ArrayHolder)row.getTag();
String array = data.get(position);
holder.txtTitle.setText(array);
return row;
}
谢谢你的快速回答。它肯定解决了问题,我现在对Android开发相当满意。我只是想掌握概念。我也是新手。欢迎来到Android和SO:)谢谢你的快速回答。它肯定解决了问题,我现在对Android开发相当熟悉。我只是想掌握概念。我也是新手。欢迎来到Android,所以:)谢谢你的快速回答。这肯定解决了问题,我现在对安卓开发相当满意。我只是想抓住这个概念。没有问题,你真的有了一个好的开始,因为你已经面临定制适配器:)谢谢你的快速回答。这肯定解决了问题,我现在对安卓开发相当满意。我只是想抓住这个概念。没有问题,您确实有了一个良好的开端,因为您已经面临自定义适配器:)