如何根据一个条件修改列表视图的元素

时间:2011-10-11 11:05:33

标签: android listview simpleadapter

我有一个使用简单适配器的列表视图。基本上每个元素都包含一个图像,一个字符串字段和一个评级栏。

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。 ......希望也是正确的,无论如何:)

2 个答案:

答案 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

中的视频