0

我有一个使用简单适配器的列表视图。基本上每个元素都由一个图像、1 个字符串字段和一个评分栏组成。

ListView 元素的布局在文件 element.xml 中,而不是列表视图在 main.xml 中

字符串字段的值可以是数字、单词 FREE 或单词 INSTALLED。

就在 element.xml 布局中的该字段附近,有一个 ID = 价格和文本值 =“应用程序价格”的标签

当我显示我的列表时,这就是我现在得到的:“应用程序价格”4“应用程序价格”免费“应用程序价格”7“应用程序价格”安装“应用程序价格”免费

基本上我想做的是检查字符串字段的值,如果它等于 INSTALLEd,标签价格必须变为不可见才能得到这个结果:

“应用程序价格” 4 “应用程序价格” 免费 “应用程序价格” 7 安装 “应用程序价格” 免费

你知道怎么做吗......我红色可能是正确的扩展我的简单适配器的方法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......无论如何它有效,但我没有使用充气机......没有它,希望也是正确的:)

4

2 回答 2

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;
    }
于 2011-10-11T11:25:07.027 回答
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;
}

在这里,我们只是使用充气机获得一个视图,并在视图中找到 textview。我们检查条件并相应地设置文本并返回视图。

那里有更好的教程。您应该搜索自定义基本适配器。

如果它对您有用,那么使用它就没有问题。只要您返回一个有效的视图,该列表就会起作用。Inflater 仅用于从 xml 文件创建视图。

但请注意帕雷什的回答。如您所见,他使用静态类来保存对行内部子项的引用。当列表首次渲染时,getview 方法仅被调用 n 次,其中 n 是此刻可见行的数量(不准确)。假设 5 行一次可见,适配器重用现有视图并仅更新其中的值。

因此,在他的代码中,他检查了 convertview 是否为空,如果是,他会膨胀一个新行,否则他使用具有更新值的现有行。我建议您观看来自Google IO的视频

于 2011-10-11T11:26:18.367 回答