簡體   English   中英

如何制作動態ExpandableListView

[英]How to make dynamic ExpandableListView

我是Android的新手,正在努力使用ExpandableListView進行以下操作。

我想有3個群組-“在線”,“離線”和“離開”。 這些組將包含將從Internet加載的子級自定義對象(聯系人)。 一次只能將對象歸為一組(盡管以后可能會更改)。

我自己嘗試了此操作而沒有尋求幫助,我將粘貼代碼-它使我能夠按正確的組顯示列表視圖,但所有組中的孩子都是如此。

在代碼中,Contact項當前僅在另一個類的向量中。

我真的很樂意為我提供一些幫助。

public class MyTreeAdaptor extends BaseExpandableListAdapter{
@Override
public boolean areAllItemsEnabled()
{
    return true;
}


private Context context;
private ArrayList<String> groups;
private ArrayList<ArrayList<Contact>> children;
public MyTreeAdaptor(Context context, ArrayList<String> groups,
        ArrayList<ArrayList<Contact>> children) {
    this.context = context;
    this.groups = groups;
    this.children = children;
}


/**
 * A general add method, that allows you to add a Contact to this list
 * 
 * Depending on if the category opf the Contact is present or not,
 * the corresponding item will either be added to an existing group if it 
 * exists, else the group will be created and then the item will be added
 * @param Contact
 */
public void addItem(Contact aContact) {
    try {
        Log.e("additem", ""+aContact.show);
        if (!groups.contains(aContact.show)) {
            groups.add(aContact.show);
        }
        int index = groups.indexOf(aContact.show);
        if (children.size() < index + 1) {
            children.add(new ArrayList<Contact>());
        }
        children.get(index).add(aContact);
    } catch (Exception e) {
        // TODO Auto-generated catch block
        Log.e("additem error", " "+e);
    }
}


@Override
public Object getChild(int groupPosition, int childPosition) {
    return children.get(groupPosition).get(childPosition);
}


@Override
public long getChildId(int groupPosition, int childPosition) {
    return childPosition;
}

// Return a child view. You can load your custom layout here.
@Override
public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
        View convertView, ViewGroup parent) {
    try {
        Contact contact = (Contact) getChild(groupPosition, childPosition);
        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.treeview, null);
        }
        TextView tv = (TextView) convertView.findViewById(R.id.text1);
        try {
            tv.setText("   " + contact.name);
            tv.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        // Depending upon the child type, set the imageTextView01

        /*if (Contact instanceof Car) {
            tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.car, 0, 0, 0);
        } else if (Contact instanceof Bus) {
            tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.bus, 0, 0, 0);
        } else if (Contact instanceof Bike) {
            tv.setCompoundDrawablesWithIntrinsicBounds(R.drawable.bike, 0, 0, 0);
        }*/
        return convertView;
    } catch (Exception e) {
        Log.e("error thr", " "+e);
        e.printStackTrace();
        return null;
    }
}


@Override
public int getChildrenCount(int groupPosition) {
    try
    {
    return children.get(groupPosition).size();
    }
    catch(Exception hh)
    {
        return 0;

    }
}


@Override
public Object getGroup(int groupPosition) {
    return groups.get(groupPosition);
}


@Override
public int getGroupCount() {
    return groups.size();
}


@Override
public long getGroupId(int groupPosition) {
    return groupPosition;
}


// Return a group view. You can load your custom layout here.
@Override
public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
        ViewGroup parent) {
    try {
        Log.e(groupPosition+"groups size is", " "+groups.size());
        String group;
        if(groups.size() > 0) 
        {
            group = (String) getGroup(groupPosition);
        }
        else
        {
            group = "null";//(String) getGroup(groupPosition);
        }

        if (convertView == null) {
            LayoutInflater infalInflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = infalInflater.inflate(R.layout.treeview, null);
        }
        TextView tv = (TextView) convertView.findViewById(R.id.text1);
        try {
            tv.setText(group);
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return convertView;
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
        return null;
    }
}


@Override
public boolean hasStableIds() {
    return true;
}


@Override
public boolean isChildSelectable(int arg0, int arg1) {
    return true;
}
}

如果您有兩種不同類型的子視圖,則必須在適配器中實現以下方法:

@Override
public int getChildTypeCount() {
    return 2;
}

@Override
public int getChildType(int groupPosition, int childPosition) {
    return groupPosition == 4 ? 1 : 0;
}

然后對getChildView方法進行以下更改:

LayoutInflater layoutInflater = (LayoutInflater) mContext
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View v = convertView;
if(v == null) {
    if (groupPosition == 4) {
        v = layoutInflater.inflate(R.layout.treeitem, null);
    } else {
        v = layoutInflater.inflate(R.layout.treeview, null);
}


TextView tt = null;
if (groupPosition != 4) {
        tt = (TextView) v.findViewById(R.id.text1);
// rest of the method

要理解這是如何工作的,花一些時間看這個視頻,並對SO這個答案。 ListView解釋的概念同樣適用於ExpandableListView。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM