【问题标题】:Group adapter items组适配器项目
【发布时间】:2015-02-20 11:23:33
【问题描述】:

我需要为地址簿创建一个自定义适配器,在自定义布局中按名字字母对它们进行分组。我怎样才能达到这样的结果?

我创建了一个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
  • 安东尼 c

  • 鲍勃

  • 鲍勃 b
  • 鲍勃·c

我在列表中看到的内容

  1. 安妮一
  2. 鲍勃一个

谢谢!

【问题讨论】:

    标签: android listview adapter android-arrayadapter


    【解决方案1】:

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

    试试这个..

    【讨论】:

    • 不明白你在给我什么建议。你能提供一个你将要实现的代码示例吗?
    【解决方案2】:

    听起来您需要一个 Rolodex 适配器,它有两个变体,找到 here。那里还有带有大量示例代码的演示应用程序。顾名思义,它的设计是为了处理数据从自身排列的情况。在您的情况下,每个名称的第一个字母。它会自动为您在适当的分组下对您的姓名列表进行排序。它与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
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-05
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 2017-09-06
      • 2021-03-03
      • 2014-08-25
      • 1970-01-01
      相关资源
      最近更新 更多