Android 如何在自定义适配器中放置另一个适配器(来自一个对象的信息)

Android 如何在自定义适配器中放置另一个适配器(来自一个对象的信息),android,android-layout,android-listview,android-arrayadapter,Android,Android Layout,Android Listview,Android Arrayadapter,如何填充已在自定义适配器行中的listview。这条路对吗 我有一个组织对象。这个组织可以有更多的联系人 例如,我想创建一个布局,上面是组织的名称,下面是联系人的名称 获取organization对象并将其放入自定义适配器中并显示名称没有问题。 但是如何在该行布局中填充listview?我没有在自定义适配器中真正获得新ArrayAdapter构造函数的上下文参数。它需要什么 public class ContactAdapter extends ArrayAdapter<Organizat

如何填充已在自定义适配器行中的listview。这条路对吗

我有一个组织对象。这个组织可以有更多的联系人

例如,我想创建一个布局,上面是组织的名称,下面是联系人的名称

获取organization对象并将其放入自定义适配器中并显示名称没有问题。 但是如何在该行布局中填充listview?我没有在自定义适配器中真正获得新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;
}
公共类ContactAdapter扩展了ArrayAdapter{
语境;
国际布局资源;
ArrayList数据=null;
公共ContactAdapter(上下文上下文、int-layoutResourceId、ArrayList数据){
超级(上下文、布局资源ID、数据);
this.context=上下文;
this.layoutResourceId=layoutResourceId;
这个数据=数据;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图行=转换视图;
OrganizationHolder=null;
if(行==null){
LayoutInflater充气器=((活动)上下文)。getLayoutInflater();
行=充气机。充气(layoutResourceId,父级,false);
holder=新组织holder();
holder.tvogname=(TextView)row.findViewById(R.id.tvogname);
holder.LvContacts=(ListView)row.findViewById(R.id.LvContacts);
row.setTag(支架);
}否则{
holder=(OrganizationHolder)行。getTag();
}
组织机构=数据获取(职位);
ArrayList联系人=新建ArrayList();
对于(联系人c:org.getContacts()){
contacts.add(c.getName());
}
Log.i(“列表”、“联系人”);
ArrayAdapter contactsadapter=新的ArrayAdapter(?,android.R.layout.simple_list_item_1,contacts);
支架.LvContacts.setAdapter(触点适配器);
holder.tvogname.setText(org.getName());
返回行;
}
静态类组织持有者{
TextView tvOrgName;
ListView联系人;
按钮btnDetails;
}
我使用了((活动)上下文)。它现在正在工作


我仍然不知道它到底是什么意思或作用。但我很高兴它现在起作用了。我仍然想知道这样做是否正确。

您不应该将ListView放在另一个ListView的行中

您可以考虑使用和子类来代替您正在使用的类。将组织用作“组”视图和联系人为“子”视图。

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

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
}
公共类MyAdapter扩展了BaseAdapter{
私人名单;
私人停车场;
私人国际帐户;
公共MyAdapter(上下文、列表){
mInflater=LayoutInflater.from(上下文);
mLIst=列表;
mCount=countItems();
}
私有int countItems(){
整数计数=0;
如果(列表!=null){
for(组织:组织){
count++;//org
List contacts=org.getContacts();
if(contacts!=null)count+=contacts.size());//contacts
}
}
返回计数;
}
public int getCount(){
返回mCount;
}
公共对象getItem(int位置){
对于(组织组织:组织){
如果(位置==0){
返回组织;
}
位置--;
List contacts=org.getContacts();
如果(联系人!=null){
int size=contacts.size();
如果(位置>=大小){
位置-=大小;
}否则{
返回联系人。获取(位置);
}
}
}
//找不到
抛出新的IndexOutOfBoundsException();//或其他异常
}
//为简洁起见,省略了其他方法
}
我将我们的方法留给了
getView()
方法,但希望您能自己解决这个问题。如果您的行需要根据显示的数据(组织或联系人)看起来有所不同,您还应该实现
getItemViewType()
getItemViewTypeCount()

我建议你看一个叫