RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 613102
Accepted
Heorhii Lysenko
Heorhii Lysenko
Asked:2020-01-11 01:58:08 +0000 UTC2020-01-11 01:58:08 +0000 UTC 2020-01-11 01:58:08 +0000 UTC

显示 ListView 项目时出现问题。线条被打乱

  • 772

可用ListViewAdapter基于BaseAdapter:

public class ContactsListAdapter extends BaseAdapter{
    private LayoutInflater inflater;
    private ArrayList<ContactsListItems> mContactsList = new ArrayList<>();

    ContactsListAdapter(Context context, ArrayList<ContactsListItems> users){
        mContactsList = users;
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }
    @Override
    public int getCount() {
        return mContactsList.size();
    }

    @Override
    public Object getItem(int i) {
        return mContactsList.get(i);
    }

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

    @Override
    public View getView(int i, View convertView, ViewGroup viewGroup) {
        View view = convertView;
        ViewHolder holder;
        ContactsListItems user = getUser(i);

        if (view == null){
            holder = new ViewHolder();
            if (user.getUIN() == -9){
                view = inflater.inflate(R.layout.contacts_list_header, viewGroup, false);
                //((TextView)view.findViewById(R.id.twGroupName_header)).setText(user.getGroupName());
                holder.twGroupName_header = (TextView)view.findViewById(R.id.twGroupName_header);
                holder.twGroupName_header.setText(user.getGroupName());
                view.setTag(R.id.group_id_contacts_listview, -1);
                view.setTag(R.id.parent_group_id_contacts_lisview, user.getParentId());
            }else {

                if (!user.ismIsGroup()) {
                    view = inflater.inflate(R.layout.item_people_in_contacts, viewGroup, false);
                   // ((TextView) view.findViewById(R.id.twContactName)).setText(user.getDisplayName());
                   // ((TextView) view.findViewById(R.id.twUIN)).setText("UIN:" + user.getUIN().toString());
                    holder.twContactName = (TextView)view.findViewById(R.id.twContactName);
                    holder.twContactName.setText(user.getDisplayName());
                    holder.twUIN = (TextView)view.findViewById(R.id.twUIN);
                    holder.twUIN.setText("UIN:" + user.getUIN().toString());
                    view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
                } else {
                    view = inflater.inflate(R.layout.item_group_in_contacts, viewGroup, false);
                    //((TextView) view.findViewById(R.id.twGroupName_contacts)).setText((user.getGroupName()));
                    holder.twGroupName_contacts = (TextView)view.findViewById(R.id.twGroupName_contacts);
                    holder.twGroupName_contacts.setText(user.getGroupName());
                    view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
                }
            }
            view.setTag(holder);
        } else {
            holder = (ViewHolder)view.getTag();
        }
        return view;
    }

    private ContactsListItems getUser(int position) {
        return ((ContactsListItems) getItem(position));
    }
    private static class ViewHolder{
        TextView twContactName;
        TextView twUIN;
        TextView twGroupName_contacts;
        TextView twGroupName_header;
    }
}

以及 ListView 中填充数据的片段:

public class Contacts extends Fragment {

    public ContactsListAdapter adapter;
    ArrayList<ContactsListItems> items = new ArrayList<>();
    String CONTACTS_LIST = "contacts_list";
    @Override
    public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        final View view = inflater.inflate(R.layout.fragment_contacts, container, false);

        SharedPreferences spref = MainPage.contextOfApplication.getSharedPreferences(Consts.APP_PREFERENCES, MainPage.MODE_PRIVATE);
        final String sData = spref.getString(CONTACTS_LIST, "");
        ContactsListItems Item;
        try {
            JSONArray contactsListJson = new JSONArray(sData);
                for (int i=0; i<contactsListJson.length(); i++){
                    JSONObject user = contactsListJson.getJSONObject(i);
                    if (user.getBoolean("IsGroup") && user.getInt("ParentID") == 0) {
                        Item = new ContactsListItems(user.getInt("UIN"),
                                user.getInt("Sex"),
                                user.getInt("ParentID"),
                                user.getInt("ID"),
                                user.getString("DisplayName"),
                                user.getString("GroupName"),
                                user.getBoolean("TeamLead"),
                                user.getBoolean("IsGroup"),
                                user.getInt("GroupID"));
                        items.add(Item);
                    }
                }

        }catch (JSONException e){
        }
        adapter = new ContactsListAdapter(getActivity(), items);
        final ListView listView = (ListView)view.findViewById(R.id.lwContacts);
        listView.setAdapter(adapter);

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
                Integer GroupId = (Integer) view.getTag(R.id.group_id_contacts_listview);
                Integer parentGroupId = (Integer) view.getTag(R.id.parent_group_id_contacts_lisview);
                ContactsListItems ItemsOnClick;
                    ArrayList<ContactsListItems> itemsOnClick = new ArrayList<>();

                //------------------------------Обработка нажатия на группу-------------------------------------
                    if (GroupId > 0) {
                        try {
                            JSONArray contactsListJson = new JSONArray(sData);
                            for (int j = 0; j < contactsListJson.length(); j++) {
                                JSONObject user = contactsListJson.getJSONObject(j);
                                if (user.getInt("GroupID") == GroupId){
                                    ContactsListItems headerItem = new ContactsListItems(-9,0,user.getInt("ParentID"),0,"", user.getString("GroupName"), false, false, user.getInt("GroupID"));
                                    itemsOnClick.add(headerItem);
                                }
                                if (user.getInt("ParentID") == GroupId) {
                                    ItemsOnClick = new ContactsListItems(user.getInt("UIN"),
                                                                         user.getInt("Sex"),
                                                                         user.getInt("ParentID"),
                                                                         user.getInt("ID"),
                                                                         user.getString("DisplayName"),
                                                                         user.getString("GroupName"),
                                                                         user.getBoolean("TeamLead"),
                                                                         user.getBoolean("IsGroup"),
                                                                         user.getInt("GroupID"));
                                    itemsOnClick.add(ItemsOnClick);

                                }
                            }

                        } catch (JSONException e) {
                            e.printStackTrace();
                        }

                        ContactsListAdapter onClickAdapter = new ContactsListAdapter(getActivity(), itemsOnClick);
                        listView.setAdapter(onClickAdapter);
                //------------------------------Обработка нажатия на группу-------------------------------------

                    } else

                //------------------------------Обработка нажатия на контакт-------------------------------------
                        if (GroupId == 0){

                        Toast t = Toast.makeText(getActivity(), "Contact", Toast.LENGTH_SHORT);
                        t.show();
                //------------------------------Обработка нажатия на контакт-------------------------------------

                    } else

                //------------------------------Обработка нажатия на header--------------------------------------
                        if (GroupId == -1){

                        ArrayList<ContactsListItems> itemsOnBackClick = new ArrayList<>();
                        try {
                            JSONArray backJson = new JSONArray(sData);
                            ContactsListItems ItemsOnBackClick;
                            for (int k=0; k<backJson.length(); k++){
                                JSONObject backUser = backJson.getJSONObject(k);


                                if ((backUser.getInt("GroupID") == parentGroupId) && parentGroupId != 0){
                                    ContactsListItems headerItem = new ContactsListItems(-9,0,backUser.getInt("ParentID"),0,"", backUser.getString("GroupName"), false, false, backUser.getInt("GroupID"));
                                    itemsOnBackClick.add(headerItem);
                                }
                                if (backUser.getInt("ParentID") == parentGroupId) {
                                    ItemsOnBackClick = new ContactsListItems(backUser.getInt("UIN"),
                                                                         backUser.getInt("Sex"),
                                                                         backUser.getInt("ParentID"),
                                                                         backUser.getInt("ID"),
                                                                         backUser.getString("DisplayName"),
                                                                         backUser.getString("GroupName"),
                                                                         backUser.getBoolean("TeamLead"),
                                                                         backUser.getBoolean("IsGroup"),
                                                                         backUser.getInt("GroupID"));
                                    itemsOnBackClick.add(ItemsOnBackClick);

                                }
                                ContactsListAdapter onBackClickAdapter = new ContactsListAdapter(getActivity(), itemsOnBackClick);
                                listView.setAdapter(onBackClickAdapter);
                            }

                        }catch (JSONException e){
                            e.printStackTrace();
                        }
                    }
                //------------------------------Обработка нажатия на header--------------------------------------

                }
        });

        return view;
    }

}

我正在尝试实现一个多级列表。使用少量元素,一切正常,但一旦元素多于手机屏幕上显示的内容,当滚动 ListView 时,元素开始打乱。嵌套在其中的功能会保留,但顺序不会。

有没有人猜到为什么?

像这样更改了 getView() 方法:

 public View getView(int i, View convertView, ViewGroup viewGroup) {
        View view = convertView;
        ViewHolder holder;
        ContactsListItems user = getUser(i);

        if (view == null){
            holder = new ViewHolder();
            if (user.getUIN() == -9){
                view = inflater.inflate(R.layout.contacts_list_header, viewGroup, false);
                holder.twGroupName_header = (TextView)view.findViewById(R.id.twGroupName_header);
                view.setTag(R.id.group_id_contacts_listview, -1);
                view.setTag(R.id.parent_group_id_contacts_lisview, user.getParentId());
            }else {

                if (!user.ismIsGroup()) {
                    view = inflater.inflate(R.layout.item_people_in_contacts, viewGroup, false);
                    holder.twContactName = (TextView)view.findViewById(R.id.twContactName);
                    holder.twUIN = (TextView)view.findViewById(R.id.twUIN);
                    view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
                } else {
                    view = inflater.inflate(R.layout.item_group_in_contacts, viewGroup, false);
                    holder.twGroupName_contacts = (TextView)view.findViewById(R.id.twGroupName_contacts);
                    view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
                }
            }
            view.setTag(holder);
        } else {
            holder = (ViewHolder)view.getTag();
        }


           if (user.getUIN() == -9){
                holder.twGroupName_header.setText(user.getGroupName());
            }else {
               if (!user.ismIsGroup()) {
                   holder.twContactName.setText(user.getDisplayName());
                   holder.twUIN.setText("UIN:" + user.getUIN().toString());
               } else {
                   holder.twGroupName_contacts.setText(user.getGroupName());
               }
           }

        return view;
    }

但是现在,滚动时,当我到达列表末尾时,会发生错误:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference
java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Heorhii Lysenko
    2020-01-12T04:39:01Z2020-01-12T04:39:01Z

    虽然我很可能会放弃 \u200b\u200busing 的想法而ListView支持RecyclerView,但我仍然找到了解决方案。感谢@post_zeew 提供的提示和信息。

    ListView适配器代码:

    public class ContactsListAdapter extends BaseAdapter{
        private LayoutInflater inflater;
        private ArrayList<ContactsListItems> mContactsList = new ArrayList<>();
    
        ContactsListAdapter(Context context, ArrayList<ContactsListItems> users){
            mContactsList = users;
            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }
    
        @Override
        public int getViewTypeCount() {
            return 3;
        }
    
        @Override
        public int getItemViewType(int position) {
            Integer flag = -1;
            ContactsListItems user = getUser(position);
                if (user.getUIN() == -9){
                flag = 0;
            }else {
                if (!user.ismIsGroup()) {
                    flag = 1;
                } else {
                    flag = 2;
                }
            }
            return flag;
        }
    
        @Override
        public int getCount() {
            return mContactsList.size();
        }
    
        @Override
        public Object getItem(int i) {
            return mContactsList.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            View view = convertView;
            ContactsListItems user = getUser(i);
            Integer type = getItemViewType(i);
    
            switch (type){
                case 0:{
                    ViewHeaderHolder headerHolder;
                    if (view == null){
                        view = inflater.inflate(R.layout.contacts_list_header, viewGroup, false);
                        headerHolder = new ViewHeaderHolder();
                        headerHolder.twGroupName_header = (TextView)view.findViewById(R.id.twGroupName_header);
                        view.setTag(R.id.group_id_contacts_listview, -1);
                        view.setTag(R.id.parent_group_id_contacts_lisview, user.getParentId());
                        view.setTag(R.id.holder_id0, headerHolder);
                    }else{
                        headerHolder = (ViewHeaderHolder)view.getTag(R.id.holder_id0);
                    }
                    if (headerHolder.twGroupName_header != null) {
                        headerHolder.twGroupName_header.setText(user.getGroupName());
                    }
                    return view;
                }
                case 1:{
                    ViewContactHolder contactHolder;
                    if (view == null){
                        view = inflater.inflate(R.layout.item_people_in_contacts, viewGroup, false);
                        contactHolder = new ViewContactHolder();
                        contactHolder.twContactName = (TextView)view.findViewById(R.id.twContactName);
                        contactHolder.twUIN = (TextView)view.findViewById(R.id.twUIN);
                        view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
                        view.setTag(R.id.holder_id1, contactHolder);
                    }else{
                        contactHolder = (ViewContactHolder)view.getTag(R.id.holder_id1);
                    }
                    if (contactHolder.twContactName != null) {
                        contactHolder.twContactName.setText(user.getDisplayName());
                        contactHolder.twUIN.setText("UIN:" + user.getUIN().toString());
                    }
    
                    return view;
                }
                case 2:{
                    ViewContactNameHolder contactNameHolder;
                    if (view == null){
                        view = inflater.inflate(R.layout.item_group_in_contacts, viewGroup, false);
                        contactNameHolder = new ViewContactNameHolder();
                        contactNameHolder.twGroupName_contacts = (TextView)view.findViewById(R.id.twGroupName_contacts);
                        view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
                        view.setTag(R.id.holder_id2, contactNameHolder);
                    }else{
                        contactNameHolder = (ViewContactNameHolder)view.getTag(R.id.holder_id2);
                    }
                    if (contactNameHolder.twGroupName_contacts != null) {
                        contactNameHolder.twGroupName_contacts.setText(user.getGroupName());
                    }
                    return view;
                }
            }
    
    
    
            return view;
        }
    
        private ContactsListItems getUser(int position) {
            return ((ContactsListItems) getItem(position));
        }
        private static class ViewContactNameHolder{
            TextView twGroupName_contacts;
        }
        private static class ViewContactHolder{
            TextView twContactName;
            TextView twUIN;
        }
        private static class ViewHeaderHolder{
            TextView twGroupName_header;
        }
    }
    

    Основными изменениями стало переопределение методов getItemViewType() и getViewTypeCount(). В первый я вынес логику сортировки данных, во втором указал количество разных layout-ов. Причем пока не переопределил getViewTypeCount(), ничего не работало.

    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    Python 3.6 - 安装 MySQL (Windows)

    • 1 个回答
  • Marko Smith

    C++ 编写程序“计算单个岛屿”。填充一个二维数组 12x12 0 和 1

    • 2 个回答
  • Marko Smith

    返回指针的函数

    • 1 个回答
  • Marko Smith

    我使用 django 管理面板添加图像,但它没有显示

    • 1 个回答
  • Marko Smith

    这些条目是什么意思,它们的完整等效项是什么样的

    • 2 个回答
  • Marko Smith

    浏览器仍然缓存文件数据

    • 1 个回答
  • Marko Smith

    在 Excel VBA 中激活工作表的问题

    • 3 个回答
  • Marko Smith

    为什么内置类型中包含复数而小数不包含?

    • 2 个回答
  • Marko Smith

    获得唯一途径

    • 3 个回答
  • Marko Smith

    告诉我一个像幻灯片一样创建滚动的库

    • 1 个回答
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Алексей Шиманский 如何以及通过什么方式来查找 Javascript 代码中的错误? 2020-08-03 00:21:37 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5