如何在ListView中使用不同的行时使用View Holder

时间:2012-11-02 12:51:35

标签: android listview

通常,适配器会使用它来优化listview的性能:

 @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,并且根据类型........ setTag为各个Holder?

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

我是以正确的方式做的吗?

谢谢

3 个答案:

答案 0 :(得分:8)

没有什么能阻止您在单个ListView课程中声明所有ViewHolder布局中的所有可能观看次数(因此ViewHolder将保留对来自您示例的ImageViewCheckBoxEditText

getViewconvertView null方法的ViewHolder方法中,您将仅针对该类型的行设置ViewHolder中的视图,null中的所有其他视图引用{1}}将ViewHolder。如果您有时间使用ViewHolder中的观看次数,只需查看您的工作类型,只能从属于该行的ViewHolder获取观看次数。

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

答案 1 :(得分:1)

- 我相信 3 rows,但 row 3 不同部件

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

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

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

答案 2 :(得分:0)

我是第二个Kumar Vivek Mitra。 你需要有一行包含所有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.