【问题标题】:My custom ArrayAdapter only repeats a few items我的自定义 ArrayAdapter 只重复几个项目
【发布时间】:2016-05-26 12:23:47
【问题描述】:

我将它用于网格视图,显示的对象计数是正确的,并且它在日志中返回是正确的,但是例如 6 个对象显示,其余的重复它们

1,2,3,4,5,6, 1,2,3,4,5,6,.....

我的代码

public class CustomAdapter extends ArrayAdapter<ItemObject> {

    private static float textViewWidth;

    public CustomAdapter(ArrayList<ItemObject> array, float textViewWidth) {
        super(G.context, R.layout.sample_album_item, array);
        CustomAdapter.textViewWidth = textViewWidth;
    }

    private static class ViewHolder {

        ImageView imgScreenShot;
        TextView txtAlbumName;
        TextView txtAlbumAuthor;


        public ViewHolder(View view) {
            imgScreenShot = (ImageView) view.findViewById(R.id.screen_shot);
            txtAlbumName = (TextView) view.findViewById(R.id.album_name);
            txtAlbumAuthor = (TextView) view.findViewById(R.id.album_author);
        }


        public void fill(final ArrayAdapter<ItemObject> adapter, final ItemObject item, final int position) {
            imgScreenShot.setImageResource(item.getScreenShot());

            String albumName = item.getAlbumName();
            String albumAuthor = item.getAlbumAuthor();

            float musicNameWidthSizeViaParent = widthSizeViaParent(txtAlbumName, albumName);
            float musicAuthorWidthSizeViaParent = widthSizeViaParent(txtAlbumAuthor, albumAuthor);

            if (musicNameWidthSizeViaParent < 0) {
                for (int i = 1; i < albumName.length() - 1; i++) {
                    if (widthSizeViaParent(txtAlbumName, albumName.substring(0, i).trim() + "...") < 0) {
                        albumName = albumName.substring(0, i - 1).trim() + "...";
                        break;
                    }
                }
            }

            if (musicAuthorWidthSizeViaParent < 0) {
                for (int i = 1; i < albumAuthor.length() - 1; i++) {
                    if (widthSizeViaParent(txtAlbumName, albumAuthor.substring(0, i).trim() + "...") < 0) {
                        albumAuthor = albumAuthor.substring(0, i - 1).trim() + "...";
                        break;
                    }
                }
            }

            txtAlbumName.setText(albumName);
            txtAlbumAuthor.setText(albumAuthor);
        }
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        ItemObject item = getItem(position);
        if (convertView == null) {
            convertView = G.inflater.inflate(R.layout.sample_album_item, parent, false);
            holder = new ViewHolder(convertView);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.fill(this, item, position);
        return convertView;
    }

    private static float widthSizeViaParent(TextView text, String newText) {
        float textWidth = text.getPaint().measureText(newText);
        return textViewWidth - (textWidth * G.displayMetrics.density);
    }

}

如果 getView 方法没有这个 (convertView == null) 条件,一切都是正确的,但滚动很慢

【问题讨论】:

  • 滚动速度太慢是您遇到的问题吗?
  • 如果您打算扩展 BaseAdapter,请使用它。
  • 在这种情况下,我搜索并了解到更平滑的滚动需要这个(convertView == null)条件。我不知道如何处理重复
  • @Nanoc,谢谢,我试试,问题依旧
  • 您的性能问题是由于在滚动期间为每一行调用 inflate() 引起的,不要调用 inflate。

标签: android android-arrayadapter android-gridview baseadapter


【解决方案1】:

我的猜测是这段代码让它运行缓慢:

public void fill(final ArrayAdapter<ItemObject> adapter, final ItemObject item, final int position) {
            imgScreenShot.setImageResource(item.getScreenShot());

            String albumName = item.getAlbumName();
            String albumAuthor = item.getAlbumAuthor();

            float musicNameWidthSizeViaParent = widthSizeViaParent(txtAlbumName, albumName);
            float musicAuthorWidthSizeViaParent = widthSizeViaParent(txtAlbumAuthor, albumAuthor);

            if (musicNameWidthSizeViaParent < 0) {
                for (int i = 1; i < albumName.length() - 1; i++) {
                    if (widthSizeViaParent(txtAlbumName, albumName.substring(0, i).trim() + "...") < 0) {
                        albumName = albumName.substring(0, i - 1).trim() + "...";
                        break;
                    }
                }
            }

            if (musicAuthorWidthSizeViaParent < 0) {
                for (int i = 1; i < albumAuthor.length() - 1; i++) {
                    if (widthSizeViaParent(txtAlbumName, albumAuthor.substring(0, i).trim() + "...") < 0) {
                        albumAuthor = albumAuthor.substring(0, i - 1).trim() + "...";
                        break;
                    }
                }
            }

            txtAlbumName.setText(albumName);
            txtAlbumAuthor.setText(albumAuthor);
        }

每个项目运行两个循环。您可能希望在模型中使用该逻辑。所以在渲染项目时,albumName 和 albumAuthor 已经设置好了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-21
    • 1970-01-01
    • 1970-01-01
    • 2014-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多