ListView 中的 Android Laggy AlphabetIndexer

标签 android

我有一个 CustomCursorAdapter 来制作漂亮的节标题。我从 ListView 行中删除了所有图像,但滚动仍然很慢。有人知道优化这个的方法吗?即使对于 2000 个联系人,在 Viber for Contacts 等应用程序上滚动也非常流畅。谢谢!

public View getView(int position, View convertView, ViewGroup parent) {
    final int type = getItemViewType(position);
    if (type == TYPE_HEADER) {
        if (convertView == null) {
            final LayoutInflater inflater = LayoutInflater.from(context);
            convertView = inflater.inflate(R.layout.list_header, parent,
                    false);
        }
        ((TextView) convertView.findViewById(R.id.list_header_title))
                .setText((String) getSections()[getSectionForPosition(position)]);
        return convertView;
    } else {
        View v = super.getView(
                position
                        - sectionToOffset
                                .get(getSectionForPosition(position)) - 1,
                convertView, parent);

        int contactIdCol = c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);

        String contactId_text = c.getString(contactIdCol);

        boolean flag = db.isRegistered(contactId_text);

        ImageView iv = (ImageView) v.findViewById(R.id.typeImage);
        if (flag) {
            iv.setImageResource(R.drawable.rocket);
        } else {

            iv.setMinimumHeight(Config.getIconSize(context));
            iv.setMinimumWidth(Config.getIconSize(context));
            iv.setImageDrawable(null);
        }

        ImageView iv1 = (ImageView) v.findViewById(R.id.test);

        cl.displayImage(contactId_text, iv1);

        return v;
    }

}

为了进一步澄清,快速滚动是不稳定的,正常滚动似乎没问题。

最佳答案

每次调用“getView”时,您都在创建一个 ListView 项。获得性能的一个好方法是创建一个表示 View 项数据的静态“viewHolder”类。

例如

static class ViewHolder
{
    ImageView icon;
    TextView title;
}

在“getView”方法中,您可以创建一个 viewHolder 实例:

    if (convertView == null) {

        final LayoutInflater inflater = LayoutInflater.from(context);

        convertView = inflater.inflate(R.layout.list_header, parent, false);

        holder = new ViewHolder();
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);
        holder.name = (TextView) convertView.findViewById(R.id.title);
        convertView.setTag(holder);

    }

然后填写您持有人的资料:

if (item != null) {
    holder.title.setText("ItemTitle");
    holder.icon.setImageResource(R.drawable.rocket);
}

return convertView;

有关详细示例,另请参阅:

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

关于ListView 中的 Android Laggy AlphabetIndexer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7315673/

相关文章:

java - Android Studio - 尝试签署 facebook 或 google 时 Firebase 返回 null

java - 无法从具有 3 行、3 列的 CursorWindow 读取第 0 行、第 3 列

android - Android UI线程的标识符

java - 如何从不同的 Activity 将开关布局添加到 RecyclerView?

java - 在 Android 中备份 SharedPreferences?

android - 在 Clojure 中创建 Android 服务

android - 如何在 android 中修剪视频(没有 ffmpeg)?

android - 在全屏模式下,滑动手势在 YouTubePlayerView 中不起作用

android - 如何在 Android Pie 中使用蓝牙 HID 设备配置文件?

android - 如何自定义 NumberPicker