android - ListView 中有不同行时如何使用 View Holder

标签 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;
        }

View 持有者是:

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 吗?

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

我这样做的方式正确吗??

谢谢

最佳答案

没有什么可以阻止您在单个 ViewHolder 类中声明来自所有 ListView 布局的所有可能 View (因此 ViewHolder将保存对示例中的 ImageViewCheckBoxEditText 的引用)。

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

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

关于android - ListView 中有不同行时如何使用 View Holder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13195624/

相关文章:

android - 在按钮内设置可绘制位置

android - 控制 ListView 中渐变边缘的颜色

android - 更新 SimpleCursorAdapter,同时保持 ListView 中的滚动位置

java - 我的 ListView 重叠在我的编辑文本上

listview - jQuery mobile listview - 无法将id添加到动态输入框

android - 如何在 Activity 中使背景图像透明?

android - 如何在 Android 中的 ACTION_CALL 之后返回到我的应用程序

android - ListView 不会自行更新

android - 如何使用 "thread"或 "AsyncTask"发送电子邮件而不显示 Android 中的默认电子邮件

android - 在限制线之间绘制背景颜色