java - 适配器重复行

标签 java android android-listview android-adapter

我有一个重复行的分段适配器,有谁知道如何解决这个问题以及为什么会发生这种情况?

这是我的适配器类:

public class CustomUsersAdapter extends BaseAdapter {

    private static final int TYPE_ITEM = 0;
    private static final int TYPE_SEPARATOR = 1;

    private ArrayList<UserInfoVO> mData = new ArrayList<UserInfoVO>();
    private TreeSet<Integer> sectionHeader = new TreeSet<Integer>();

    private LayoutInflater mInflater;

    public CustomUsersAdapter(Context context) {
        mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public void addItem(final UserInfoVO item) {
        mData.add(item);
        notifyDataSetChanged();
    }

    public void addSectionHeaderItem(final UserInfoVO item) {
        mData.add(item);
        sectionHeader.add(mData.size() - 1);
        notifyDataSetChanged();
    }

    @Override
    public int getItemViewType(int position) {
        return sectionHeader.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
    }

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getCount() {
        return mData.size();
    }

    @Override
    public UserInfoVO getItem(int position) {
        return mData.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        int rowType = getItemViewType(position);

//        if (convertView == null) {

        holder = new ViewHolder();
        switch (rowType) {
            case TYPE_ITEM:
                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.members_list_item, null);
                    holder = new ViewHolder();
                    holder.userImage = (CXRemoteImageView) convertView.findViewById(R.id.members_item_pic);
                    holder.title = (CXRobotoTextView) convertView.findViewById(R.id.members_item_title);
                    holder.small_text = (CXRobotoTextView) convertView.findViewById(R.id.members_item_small_text);
                    holder.userImage.loadImmediate(mData.get(position).getPictureUrl());
                    holder.title.setText(mData.get(position).getName());
                    holder.small_text.setText(mData.get(position).getAboutMe());
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                break;
            case TYPE_SEPARATOR:
                if (convertView == null) {
                    convertView = mInflater.inflate(R.layout.members_category_item, null);
                    TextView category = (TextView) convertView.findViewById(R.id.members_item_category);
                    category.setText(mData.get(position).getName());
                    convertView.setTag(category);
                } else {
                    TextView category=(TextView) convertView.getTag();
                }
                break;
        }

//            convertView.setTag(holder);
//        } else {
//            try {
//                holder = (ViewHolder) convertView.getTag();
//            }catch (Exception e)
//            {
//                e.printStackTrace();
//            }
//        }

        return convertView;
    }

    static class ViewHolder {
        public CXRemoteImageView userImage;
        public CXRobotoTextView title;
        public CXRobotoTextView small_text;
    }

}

这是我填充它的方法:

boolean members = false;
            boolean friends = false;

            usersAdapter=new CustomUsersAdapter(getActivity());
            for (int i = 0; i < rFArray.size(); i++) {
                if (rFArray.get(i).getName().equalsIgnoreCase("Members") || rFArray.get(i).getName().equalsIgnoreCase("My Friends")) {
                    if (rFArray.get(i).getName().equalsIgnoreCase("Members")) {
                        if (!members) {
                            members = true;
                            usersAdapter.addSectionHeaderItem(rFArray.get(i));
                        }

                    }
                    if (rFArray.get(i).getName().equalsIgnoreCase("My Friends")) {

                        if (!friends) {
                            friends = true;
                            usersAdapter.addSectionHeaderItem(rFArray.get(i));
                        }
                    }
                } else {
                    usersAdapter.addItem(rFArray.get(i));
                }
            }



            list.setAdapter(usersAdapter);

最佳答案

您重复行是因为您错误地处理了 convertView 不为 null 的情况。在这种情况下,您实际上也必须填写小部件。您只需跳过 inflate() 调用,因为您正在回收现有行。就您而言,回收时您会跳过所有内容

关于java - 适配器重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26935450/

相关文章:

java - 使用文件资源管理器将文件导入 android

java - jList 不显示来自自定义模型的数据?

java - 混合应用程序和小程序

android - 没有长触摸,WebView 不会在某些设备上滚动

android - 当滚动 ListView 时,取消选择的图像也显示

java - 使 ListView 项目可点击出现问题

java - ImageIO - 获取图像类型和 exif 数据

android - 如何更改 Android Studio/Gradle 中库的资源覆盖顺序?

android - Admob Interstitial 打开按钮是否有效?

android - 将 fragment 添加到 ListView 项中