其他分享
首页 > 其他分享> > android-如何将另一个适配器放在我的自定义适配器中(来自一个对象的信息)

android-如何将另一个适配器放在我的自定义适配器中(来自一个对象的信息)

作者:互联网

如何填充已经在自定义适配器行内的列表视图.这是正确的方法吗?

我有一个组织对象.而且这个组织可以有更多的联系.

因此,我想创建一个布局,在其顶部具有组织名称,然后是其下的联系人名称.

获取组织对象并将其放入我的自定义适配器中并显示名称是没有问题的.
但是,如何在该行布局中填充列表视图?我真的没有在自定义适配器中获得新的ArrayAdapter构造函数的上下文参数.需要什么

public class ContactAdapter extends ArrayAdapter<Organization> {
Context context;
int layoutResourceId;
ArrayList<Organization> data = null;

public ContactAdapter(Context context, int layoutResourceId, ArrayList<Organization> data) {
    super(context, layoutResourceId, data);
    this.context = context;
    this.layoutResourceId = layoutResourceId;
    this.data = data;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    OrganizationHolder holder = null;

    if (row == null) {
        LayoutInflater inflater = ((Activity)context).getLayoutInflater();
        row = inflater.inflate(layoutResourceId, parent,false);

        holder = new OrganizationHolder();
        holder.tvOrgName = (TextView)row.findViewById(R.id.tvOrgName);
        holder.LvContacts = (ListView)row.findViewById(R.id.LvContacts);

        row.setTag(holder);

    } else {
        holder = (OrganizationHolder) row.getTag();
    }

    Organization org = data.get(position);
    ArrayList<String> contacts = new ArrayList<String>();
    for (Contact c : org.getContacts()) {
        contacts.add(c.getName());
    }
    Log.i("List",""+contacts);
    ArrayAdapter<String> contactsadapter = new ArrayAdapter<String>(??,android.R.layout.simple_list_item_1,contacts);
    holder.LvContacts.setAdapter(contactsadapter);
    holder.tvOrgName.setText(org.getName());

    return row; 
}

static class OrganizationHolder {
    TextView tvOrgName;
    ListView LvContacts;
    Button btnDetails;
}

解决方法:

您不应在另一个ListView的行中包含ListView.

您可能会考虑使用ExpandableListViewBaseExpandableListAdapter子类,而不是现在使用的类.将组织用作“组”视图,将联系人用作“子”视图.

如果您不想要一个可扩展的列表,并且绝对需要一个适配器中的所有信息,则可以形成一个数据结构,该数据结构是组织的地图(或列表),每个组织都有一个联系人列表.然后,您将编写一个自定义适配器实现来使用它.

public class MyAdapter extends BaseAdapter {
    private List<Organization> mList;
    private LayoutInflater mInflater;
    private int mCount;

    public MyAdapter(Context context, List<Organization> list) {
        mInflater = LayoutInflater.from(context);
        mLIst = list;
        mCount = countItems();
    }

    private int countItems() {
        int count = 0;
        if (list != null) {
            for (Organization org : organizations) {
                count++; // org
                List<Contact> contacts = org.getContacts();
                if (contacts != null) count += contacts.size()); // contacts
            }
        }
        return count;
    }

    public int getCount() {
        return mCount;
    }

    public Object getItem(int position) {
        for (Organization org : orgnizations) {
            if (position == 0) {
                return org;
            }
            position--;
            List<Contact> contacts = org.getContacts();
            if (contacts != null) {
                int size = contacts.size();
                if (position >= size) {
                    position -= size;
                } else {
                    return contacts.get(position);
                }
            }
        }
        // not found
        throw new IndexOutOfBoundsException(); // or some other exception
    }

    // other methods omitted for brevity
}

我离开了我们的getView()方法,但是希望您可以自己解决这个问题.如果您需要根据显示的数据(组织或联系人)使行看起来有所不同,则还应该实现getItemViewType()和getItemViewTypeCount().

我建议您观看名为The World of ListView的视频

标签:android-layout,android-listview,android-arrayadapter,android
来源: https://codeday.me/bug/20191123/2064441.html