我有一个使用简单适配器的列表视图。基本上每个元素都包含一个图像,一个字符串字段和一个评级栏。
ListView元素的布局位于文件element.xml中 相反,列表视图位于main.xml
中字符串字段的值可以是数字,单词FREE或单词INSTALLED。
只需在element.xml布局中接近此字段,就会出现ID = Price且文本值=“应用价格”的标签
这是我在显示列表时得到的内容: “申请价格”4 “申请价格”免费 “申请价格”7 “申请价格”已安装 “申请价格”免费
基本上我想做的是检查字符串字段的值,如果它等于INSTALLEd,则标签Price必须变为不可见以获得此结果:
“申请价格”4 “申请价格”免费 “申请价格”7 INSTALLED “申请价格”免费
你知道怎么做......我是红色的,可以扩展我的简单适配器的方法getview,但我不知道怎么.....我不清楚这个方法是如何工作的以及他的参数代表什么.....你能帮助我或建议我做正确的事吗?
public View getView(int position, View convertView, ViewGroup parent)
{
View view = super.getView(position, convertView, parent);
TextView costo = (TextView) view.findViewById(R.id.costo);
TextView prezzo = (TextView) view.findViewById(R.id.appPrezzo);
if (prezzo.getText().equals("Installed"))
{
costo.setVisibility(View.INVISIBLE);
//view = inflater.inflate(R.layout.elem_applist, null);
}
else
{
costo.setVisibility(View.VISIBLE);
}
return view;
我是这样做的......我不知道为什么我可以评论或投票给你答案Blessemn .....无论如何它有效,但我没有使用inflater。 ......希望也是正确的,无论如何:)
答案 0 :(得分:1)
尝试以下代码来定义自定义列表视图。 例如:
public static class ViewHolder
{
ImageView imgViewLogo;
TextView txtViewTitle;
TextView txtViewDescription;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder;
if(convertView==null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.items, null);
holder.imgViewLogo = (ImageView) convertView.findViewById(R.id.imgViewLogo);
holder.txtViewTitle = (TextView) convertView.findViewById(R.id.txtViewTitle);
holder.txtViewDescription = (TextView) convertView.findViewById(R.id.txtViewDescription);
convertView.setTag(holder);
}
else
holder=(ViewHolder)convertView.getTag();
ItemBean bean = (ItemBean) itemList.get(position);
holder.imgViewLogo.setImageResource(bean.getImage());
holder.txtViewTitle.setText(bean.getTitle());
holder.txtViewDescription.setText(bean.getDescription());
return convertView;
}
答案 1 :(得分:1)
在getview方法中调用返回表示每一行的视图。即使滚动列表,也会多次调用它。你得到的论据
位置 - >行号。 convertview - >表示行的视图。在开始时为空。但一旦呈现 它不会是空的。 父母 - >父视图
在getview方法中,您必须返回一个视图来表示该行。
看看正常的getView方法是怎样的
@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mInflater.inflate(R.layout.analytics_row, null);
TextView mNae = (TextView)convertView.findViewById(R.id.analytic_name);
if(data.get(position).mystring == ""){
mNae.setText("YES");
} else {
mNae.setText("No");
}
return convertView;
}
这里我们只使用inflater获取视图,并在视图中找到textview。 我们检查条件并相应地设置文本并返回视图。
有更好的教程。您应该搜索自定义基本适配器。
如果适合您,则使用它没有问题。只要您返回有效视图,列表就可以使用。 Inflater仅用于从xml文件创建视图。
但请注意paresh的回答。正如您所看到的,他使用静态类来保存对行内部子项的引用。首次渲染列表时,getview方法仅被称为n次,其中n是此刻可见行的数量(不精确)。假设一次可见5行,适配器重用现有视图并只更新其中的值。
因此,在他的代码中,他检查它是否为convertview,如果是,他会膨胀一个新行,否则他使用具有更新值的现有行。我建议您观看Google IO
中的视频