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

Arc*_*pgc 3 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;
        }
Run Code Online (Sandbox Code Playgroud)

和查看持有人是:

public static class ViewHolder {
    public TextView textView;
}
Run Code Online (Sandbox Code Playgroud)

但是如果我有不同类型的行,例如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
}
Run Code Online (Sandbox Code Playgroud)

并在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();
}
Run Code Online (Sandbox Code Playgroud)

但是ViewHolders怎么样,我应该有3个不同的ViewHolders并且根据类型........ setTag为各自的持有人?

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

我这样做是对的吗?

谢谢

Luk*_*rog 8

没有什么从所有申报所有可能的意见停止你ListView在一个单一的布局ViewHolder类(所以ViewHolder将举行一个参考ImageView,CheckBoxEditText从你的例子).

在该getView方法中,当convertViewnull你,就设置意见ViewHolder为该类型行只,在所有其他观点的引用ViewHoldernull.什么时候使用视图来ViewHolder看看你工作的哪种类型的行只能ViewHolder从属于那一行的视图中获取视图.

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