如果标题的第一个字符与列表中的第一个字符匹配,我需要隐藏或显示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中检查标题和显示/隐藏标签也没有帮助。非常感谢任何帮助。
答案 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;
}