java - 从 ViewHolder 中删除行

标签 java android sidebar android-viewholder

这里完全是核武器。我正在尝试从 Android 应用程序中用作侧边栏菜单的 Viewholder 中删除一行。

其中一个菜单项返回“EMPTY_LABEL”文本。我可以将文本设置为不可见,但我宁愿完全删除该行。关于如何做到这一点有什么想法吗?

下面的代码 - 非常感谢您的帮助!

        ViewHolder holder;
        int type = getItemViewType(position);

        APMenuItem currentItem = mData.get(position);
        Integer rId = getResources().getIdentifier("sidebar_label_" + currentItem.getKey(), "string", APBaseInnerActivity.this.getPackageName());

        if (convertView == null) {
            holder = new ViewHolder();
            switch (type) {
                case 1:
                    convertView = mInflater.inflate(R.layout.drawer_list_item_profile, null);
                    holder.textView = (TextView) convertView.findViewById(R.id.text1);
                    holder.textView.setText(APApplication.getUserInfo().getDisplayName());
                    holder.textView.setHeight(APDimensions.convertDpToPixel(60, APBaseInnerActivity.this));
                    holder.avatar = (DrawerRoundedImageView) convertView.findViewById(R.id.avatar);
                    holder.pendingImage = (ImageView) convertView.findViewById(R.id.profile_pending_image);
                    holder.pendingBackground = (ImageView) convertView.findViewById(R.id.profile_pending_background);

                    holder.pendingImage.setVisibility(View.GONE);
                    holder.pendingBackground.setVisibility(View.GONE);

                    if( APApplication.getUserInfo().getAvatarUrl() != null ) {
                        holder.avatar.setImageUrl(APApplication.getUserInfo().getAvatarUrl());

                        if ( !APApplication.getUserInfo().getIsAvatarApproved() )
                        {
                            holder.pendingImage.setVisibility(View.VISIBLE);
                            holder.pendingBackground.setVisibility(View.VISIBLE);
                        }
                    }
                    else {
                        holder.avatar.setImageResource(R.drawable.rounded_rectangle_2_copy_2);
                    }

                    break;
                case 2:
                    convertView = mInflater.inflate(R.layout.drawer_list_item, null);
                    break;
                case 3:
                    convertView = mInflater.inflate(R.layout.drawer_list_item_bottom, null);
                    holder.textView = (TextView) convertView.findViewById(R.id.text1);
                    if( rId != null ){
                        holder.textView.setText(getResources().getString(rId));
                    }
                    else{
                        holder.textView.setText("EMPTY_LABEL");

                    }
                    holder.textView.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
                    holder.textView.setHeight(APDimensions.convertDpToPixel(40, APBaseInnerActivity.this));
                    break;
            }
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        if( type == 2 ){
            holder.textView = (TextView) convertView.findViewById(R.id.text1);

            if( rId != null && rId != 0){
                holder.textView.setText(getResources().getString(rId));
            }
            else{
                holder.textView.setText("EMPTY_LABEL");
            }

            holder.circleView = (TextView) convertView.findViewById(R.id.counter);
            holder.textView.setHeight(APDimensions.convertDpToPixel(50, APBaseInnerActivity.this));

            if (currentItem.getCount() > 0) {
                Integer cnt = currentItem.getCount();
                holder.circleView.setText(cnt.toString());
                holder.circleView.setVisibility(View.VISIBLE);
            } else {
                holder.circleView.setVisibility(View.INVISIBLE);
            }
        }

        return convertView;
    }
}

public static class ViewHolder {
    public TextView textView;
    public TextView circleView;
    public DrawerRoundedImageView avatar;
    public ImageView pendingImage;
    public ImageView pendingBackground;
}

}

最佳答案

那么您是在问如何删除显示空值的 TextView 吗?

我认为您误解了 ViewHolder 的概念。 ViewHolder 用于存储 View 引用,以避免每次出现新项目时调用 findViewById()

适配器 View 中的 View 被重用。这意味着 ViewHolder 也是如此。如果您从一个 View 中删除 TextView,那么在重用相同 View 和 viewholder 的其他 View 中,该 TextView 也会被删除。

只需在 getView() 中以编程方式隐藏/显示它。这是一种常见的做法,没有什么问题。如果除此一个 View 之外还有更多差异,请创建单独的布局和另一种 View 类型。

编辑。

就您而言,隐藏和显示 TextView 看起来像这样。

if( rId != null ) {
    holder.textView.setVisibility(View.VISIBLE);
    holder.textView.setText(getResources().getString(rId));
} else {
    holder.textView.setVisibility(View.GONE);
}

关于java - 从 ViewHolder 中删除行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43946863/

相关文章:

java - 以编程方式查找给定的 IProject 对象是否与存储库共享

java - Google Cloud Storage API 和可恢复上传返回 null Location header

android - 自定义Android开发环境分辨率(Android x86与eclipse结合)

html - 移动设备上的 Bootstrap 4 sidenav 不在左侧

css - 如何在 Wordpress 侧边栏中扩展宽度?

java - 从 activeMQ 获取所有 Queue

java - 多次类型转换

java - FrameLayout 无法转换为 AbsListView Layout Params

android - 如何在使用 ANDROID_DEPLOYMENT_DEPENDENCIES 时在 pro 文件中包含特定的插件或库?

javascript - 如何在显示侧边栏时禁用背景并单击除侧边栏以外的任何地方将关闭侧边栏