1

如果标题的第一个字符在列表中第一次匹配,我需要隐藏或显示 listView 行的标签。我附上可以帮助清楚理解的图片。 在此处输入图像描述

当我创建联系人的 ArrayList 时,我尝试这样做:

public ArrayList<ContactItem> getDisplayContacts(Context context)
    {   
        ArrayList<ContactItem> contactsList = null;
        DatabaseHandler db = new DatabaseHandler(context.getApplicationContext());
         try {
            Dao<ContactItem,Integer> daoSubject = db.getContactDao();
            contactsList = (ArrayList<ContactItem>) daoSubject.queryForAll();
         }
         catch(Exception e)
         {e.printStackTrace();}
         Collections.sort(contactsList, new Comparator<ContactItem>() {
                @Override
                public int compare(ContactItem lhs, ContactItem rhs) {
                    return lhs.getName().compareTo(rhs.getName());
                }
            });
         for (int i =0; i< contactsList.size()-1;i++)
         {
             if (!contactsList.get(i).getName().substring(0,1).equalsIgnoreCase(contactsList.get(i+1).getName().substring(0,1)))
                 contactsList.get(i).setContactLabel(true);
             else 
                 contactsList.get(i).setContactLabel(false);
         }
        return contactsList;

    }

但没有得到正确的结果。我还尝试将所有视图放入自定义 ArrayAdapter 并在创建 listView 后进行更改,但这也没有帮助。在 getView 中检查标题和显示/隐藏标签也没有帮助。将非常感谢任何帮助。

4

2 回答 2

1

首先 - 记住“字母项目”应该在的所有位置。对于 'a' 它很可能是 0,对于 'b' = 以'a' 开头的名称的数量,对于'c' = 'b' 位置 + 以'b' 开头的项目的数量等等。让它成为一个 String 类型的 SparseArray。

完成所有这些后,您应该将所有数据放入 SparseArray,其中每个项目 inex 将调整为先前的计算。例如,Alex - 1(0 代表“a”标签),Bob - 3(2 代表“b”标签)等等。

然后你编写自定义适配器和覆盖方法

public View getView(int position, View convertView, ViewGroup parent)

因此,就好像“位置”包含在第一个数组中一样,您返回带有适当后者的“标签”视图,否则,您可以通过访问第二个数组获得一个公共行项目。

英语不是我的母语,所以可能很难理解一些东西——不要犹豫,问问题。

于 2013-08-09T04:53:02.533 回答
0

我决定发布我的决定,也许它对某人有帮助。所以首先我得到了我的 ContactItem 的 ArrayList。然后我创建我的 SparseArray 容器来为标签提供相应的位置(在设置适配器之前在 ListFragment 中调用此方法):

 private SparseArray<String> adapterLabels(ArrayList<ContactItem> a)
      {
      labels = new SparseArray<String>(a.size());
      labels.append(0, a.get(0).getName().substring(0, 1));
         for(int i=1;i<a.size()-1;  i++)
         {

             if (!a.get(i).getName().substring(0, 1).equalsIgnoreCase(a.get(i-1).getName().substring(0, 1)))
                {

                    labels.append(i, a.get(i).getName().substring(0, 1));

                }
         }  
         return labels;
      }

这是我的适配器的构造函数: public ContactAdaper(Context context, int layoutResourceId,List contacts, SparseArray labels) { super(context, layoutResourceId, contacts); this.layoutResourceId = layoutResourceId; this.context = 上下文;

       this.contacts = new ArrayList<ContactItem>();
       this.contacts.addAll(contacts);
       this.labels = labels;


   }

这是适配器的 getView() 方法:

    @Override
   public View getView(int position, View convertView, ViewGroup parent) {
       View row = convertView;
       view = row;
       if(row == null)
       {
        LayoutInflater inflater = (LayoutInflater)this.context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
           row = inflater.inflate(R.layout.contact_item, parent, false);
           holder = new ContactHolder();
           holder.contact_label=(TextView)row.findViewById(R.id.contact_label);
           holder.contactIcon = (ImageView)row.findViewById(R.id.contactIcon);
           holder.contactName = (CustomTextView)row.findViewById(R.id.contactName);
           holder.contactNumber = (CustomTextView)row.findViewById(R.id.contactNumber);
           holder.contactDays = (CustomTextView)row.findViewById(R.id.contactDays);
           row.setTag(holder);
       }
       else
       {
           holder = (ContactHolder)row.getTag();
       }

       ContactItem contact = filtredContacts.get(position);
       try{
            if (contact.getContactGroup()!=null)
                holder.contactIcon.setBackgroundResource(contact.getContactGroup().getIcon());
               else
                holder.contactIcon.setBackgroundResource(contact.getIcon());


                holder.contactName.setText(contact.getName());
                holder.contactNumber.setText(contact.getNumber());
                holder.contactDays.setText(Integer.toString(contact.getDays()));
                if (labels.get(position)!=null)
                {
                    holder.contact_label.setVisibility(View.VISIBLE);
                        holder.contact_label.setText(labels.get(position));
                }
                else
                        holder.contact_label.setVisibility(View.INVISIBLE);
       }
       catch(Exception e)
       {
        e.printStackTrace();

       }

       return row;
   }
于 2013-08-12T08:35:38.533 回答