动态隐藏或显示与标题的第一个字符对应的ListView行中的TextView

时间:2013-08-09 01:58:11

标签: android listview android-arrayadapter custom-adapter

如果标题的第一个字符与列表中的第一个字符匹配,我需要隐藏或显示listView行的标签。我附上有助于清楚理解的图片。 enter image description here

当我创建联系人的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中检查标题和显示/隐藏标签也没有帮助。非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

首先 - 记住'letter-item'应该是的所有位置。对于'a',它最可能是0,因为'b'='a'开始的名字的数量,'c'='b'的帖子+'b'开始的项目的数量等等。设这个为String类型的SparseArray。

当你得到所有这些时,你应该将所有数据都放到SparseArray中,其中每个项目将被调整为先前的计算。例如,Alex - 1(0代表'a'标签),Bob - 3(2代表'b'标签),依此类推。

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

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

所以,就好像'position'包含在第一个数组中一样,你返回'label'-view并使用适当的后者,否则,你会通过访问第二个数组获得一个共同的行项。

英语不是我的母语,所以可能很难理解 - 不要犹豫提问。

答案 1 :(得分: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 = 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;
   }