3

通常一个适配器会有这个来优化列表视图的性能:

 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            System.out.println("getView " + position + " " + convertView);
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item1, null);
                holder = new ViewHolder();
                holder.textView = (TextView)convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }

视图持有者是:

public static class ViewHolder {
    public TextView textView;
}

但是如果我有不同类型的行,比如 1 带有 ImabeView,1 带有 CheckBox,1 带有 EditText

第一件事将是:

@Override
public int getViewTypeCount() {

    return 3;
}

@Override
public int getItemViewType(int position) {

         //if something
         return 0
         //if something else
         return 1
         //if something different
         return 2
}

并在 getView();

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

    //if convetView == null, getItemViewType(position) and depending on the type inflate respective layout
    convertView.setTag(holder);
   //else
    holder = (ViewHolder)convertView.getTag();
}

但是 ViewHolders 呢,我应该有 3 个不同的 ViewHolders 并且取决于各自的 Holder 的类型........setTag?

我可以找到任何这样的例子。实际上我还没有看到使用超过 1 个 ViewHolder 的 ListView。

我做对了吗?

谢谢你

4

3 回答 3

8

没有什么能阻止您从ListView一个ViewHolder类中的所有布局中声明所有可能的视图(因此ViewHolder将持有对 an 的引用ImageViewCheckBox并且EditText来自您的示例)。

getView方法中,convertViewnullViewHolder只为该类型的行设置视图,所有其他视图引用都ViewHolder将是null。当需要使用视图时,ViewHolder只需查看您使用哪种类型的行,并仅从ViewHolder属于该行的视图中获取视图。

您还可ViewHolder以为每种类型的行使用三个类(并在膨胀时为每个特定行设置它们),但我认为第一个版本更好。最后,只要您正确实施多行类型机制,您就可以采用任何一种方式。

于 2012-11-02T13:19:24.943 回答
1

-我相信它不是3 rows,而是具有 3 个不同组件的Singlerow

-您需要的是holder class具有3 个不同组件的单一组件。

请参阅以下链接中的此示例:

http://www.ezzylearning.com/tutorial.aspx?tid=1763429

于 2012-11-02T12:58:19.087 回答
0

我第二个 Kumar Vivek Mitra。您需要有 1 行包含另一行下方的所有 3 个视图。但是,如果您想要不同的行,请尝试以下操作:

- create a custom row and put all the 3 views in it.
- set the visibility of all these views to GONE
- get the reference of all three views in ViewHolder.
- when setting the list, change the visibility of those views which you want to show to VISIBLE.  
于 2012-11-02T13:27:07.073 回答