繁体   English   中英

组适配器项

[英]Group adapter items

我需要为地址簿创建一个自定义适配器,在自定义布局中按名字字母对它们进行分组。 我怎么能得到这样的结果? 在此输入图像描述

我创建了一个Hashmap<String firstLetter,Arraylist<Contacts>>但我不知道如何将它传递给适配器以使列表中的每个单元素可单击。

我到目前为止找到的最佳解决方案是为我的HashMap的每个字母充气尽可能多的ListView,并将适配器设置为它

for (Map.Entry<Character, ArrayList<RlyJiffyContact>> entry : contactLinkedHashMap.entrySet()) {
        Character key = entry.getKey();
        ArrayList<RlyJiffyContact> value = entry.getValue();
        if (value != null && !value.isEmpty()) {
            LinearLayoutWithLabel llbel = new LinearLayoutWithLabel(getContext());
            llbel.setOrientation(LinearLayout.VERTICAL);
            llbel.setPadding(R.dimen.default_margin_left, R.dimen.default_margin_top, R.dimen.default_margin_right, R.dimen.default_margin_bottom);
            llbel.setText(key.toString().toUpperCase());
            ListView list = new ListView(getContext());
            list.setAdapter(new RlyJiffyContactsAdapter(getContext(), value));
            llbel.addView(list);
            linear.addView(llbel);
        }

和适配器

public class MYADAPTER extends ArrayAdapter<MYELEMENT> {

LayoutInflater vi;
private Context               context;
private List<RlyJiffyContact> contacts;
public MYADAPTER(Context context, List<MYELEMENT> contacts) {
    super(context, 0, contacts);
    vi = LayoutInflater.from(context);
    this.context = context;
    this.contacts = contacts;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolderItem holderItem;
    View v = convertView;
    if (convertView == null) {
        holderItem = new ViewHolderItem();

        convertView = vi.inflate(R.layout.reply_jiffy_contact_line, null);
        holderItem.contactNumber = (TextView) convertView.findViewById(R.id.contact_number);
        holderItem.displayName = (TextView) convertView.findViewById(R.id.contact_display_name);
        holderItem.preferedImage = (ImageView) convertView.findViewById(R.id.icon_prefered);
        convertView.setTag(holderItem);
    } else {
        holderItem = (ViewHolderItem) convertView.getTag();
    }
    RlyJiffyContact item = getItem(position);
    holderItem.contactNumber.setText(item.getPhoneNumber());
    holderItem.displayName.setText(item.getName() + " " + item.getSurname());
    if (item.isPrefered()) {
        holderItem.preferedImage.setVisibility(View.INVISIBLE);
    } else {
        holderItem.preferedImage.setVisibility(View.VISIBLE);
    }
    convertView.setOnClickListener(new ContactPhoneListener(item.getPhoneNumber()));
    return convertView;
}
static class ViewHolderItem {
    TextView  contactNumber;
    TextView  displayName;
    ImageView preferedImage;

}
private class ContactPhoneListener implements View.OnClickListener {
    private String number;
    public ContactPhoneListener(String number) {
        this.number = number;
    }
    @Override
    public void onClick(View v) {
        Intent i = new Intent(getContext(), FIRSTACTIVITY.class);
        i.putExtra(Constants.CONTACT_IDENTIFIER, number);
        i.setAction(Constants.SENDING_CONTACT);
        context.startActivity(i);
    }
}

但结果是我只能看到每个字母的第一个元素(例如:

我的联系方式:

  • 安妮
  • 安妮B.
  • 安东尼

  • 鲍勃

  • 鲍勃b
  • 鲍勃c

我在列表中看到的内容

  1. 安妮
  2. 鲍勃

谢谢!

要实现这种类型的列表:使用Char或String类型的ArrayList,在getView()方法中通过name.chatAt(0).toUpperCase()获取名称的第一个字母; in if条件如果数组包含名称的第一个字符,则只返回getview方法的普通视图,否则在数组中添加字符并创建一个简单的textview并在textview上设置字符并从getview方法返回textview 。

尝试这个..

听起来你需要一个Rolodex适配器,其中有两个变种,在这里找到。 还有那里有大量示例代码的演示应用程序。 顾名思义,它的设计可以处理数据自身排列的情况。 在您的情况下,每个名称的第一个字母。 它会自动为您分配适当分组下的名称列表。 它与ExpandableListView一起使用,并允许您指定子项和分组是否可单击。 默认是可点击的。 如果您不需要过滤功能,我建议您专门使用NFRolodexArrayAdapter 这是一个简单的例子:

活动/片段

//There's no need to pre-compute what the groupings are for each contact. Just pass in your List of contacts as is. 
PeopleAdapter adapter = new PeopleAdapter (this, mContacts);
mExpandableListView.setAdapter(adapter);

适配器

class PeopleAdapter extends NFRolodexArrayAdapter<String, Contacts> {

    PeopleAdapter(Context activity, Collection<Contacts> items) {
        super(activity, items);
    }

    @Override
    public String createGroupFor(Contacts childItem) {
        //This is how the adapter determines what the groupins are and what contact belongs to it
        return childItem.getFirstLetterOfFirstName();
    }

    @Override
    public View getChildView(LayoutInflater inflater, int groupPosition, int childPosition,
                         boolean isLastChild, View convertView, ViewGroup parent) {
        //Inflate your view

        //Gets the Contact data for this view
        Contacts contact = getChild(groupPosition, childPosition);

        //Fill view with contact data
    }

    @Override
    public View getGroupView(LayoutInflater inflater, int groupPosition, boolean isExpanded,
                         View convertView, ViewGroup parent) {
        //Inflate your group view

        //Gets the Letter for this view
        String letter = getGroup(groupPosition);

        //Fill view with letter
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM