【问题标题】:android: customizing the ExpandableListViewandroid: 自定义 ExpandableListView
【发布时间】:2013-01-22 12:48:59
【问题描述】:

我正在尝试通过修改我找到的一些代码来自定义 expandableListView。这会调用一个自定义适配器,并为列表视图增加​​所需的行。

我的问题:我需要将那个东西与其他布局组件一起使用,所以为了我需要调用 setContentView 然后在我需要的地方膨胀 listView。我所有的尝试都以应用程序崩溃告终,有人能告诉我如何调整下面的代码以在 Layout 中工作吗?

主活动:

 public class MainActivity extends ExpandableListActivity implements
    OnChildClickListener {
private static final String[] Groups = { "G1", "G2",
        "G3", "G4" };
private static final String[] Services = { "Service1",
        "Service2", "Service3", "Service4", "Service5",
        "Service6" };
private static final String[] Test = { "Test1", "Test2",
    "Test3", "Test4" };
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);


    ExpandableListView expandbleLis = getExpandableListView();
    expandbleLis.setDividerHeight(2);
    expandbleLis.setGroupIndicator(null);
    expandbleLis.setClickable(true);

    setGroupData();
    setChildGroupData();

    NewAdapter mNewAdapter = new NewAdapter(groupItem, childItem);
    mNewAdapter
            .setInflater(
                    (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE),
                    this);
    expandbleLis.setAdapter(mNewAdapter);
    expandbleLis.setOnChildClickListener(this);
}

public void setGroupData() {
    for (int i = 0; i < 4; i++) {
        groupItem.add(Groups[i]);
    }
}

ArrayList<String> groupItem = new ArrayList<String>();
ArrayList<Object> childItem = new ArrayList<Object>();

public void setChildGroupData() {
    /**
     * Add Data For Services
     */
    ArrayList<String> child = new ArrayList<String>();
    for (int i = 0; i < 6; i++) {
        child.add(Services[i]);
    }
    childItem.add(child);

    /**
     * Add Data For Test
     */
    child = new ArrayList<String>();
    for (int i = 0; i < 4; i++) {
        child.add(Test[i]);
    }
    childItem.add(child);
    /**
     * 
     */
    child = new ArrayList<String>();
    child.add("Dummy Text");
    child.add("Dummy Text");
    child.add("Dummy Text");
    child.add("Dummy Text");
    childItem.add(child);
    /**
     * 
     */
    child = new ArrayList<String>();
    child.add("Dummy Text");
    child.add("Dummy Text");
    child.add("Dummy Text");
    child.add("Dummy Text");
    childItem.add(child);
}

@Override
public boolean onChildClick(ExpandableListView parent, View v,
        int groupPosition, int childPosition, long id) {
    Toast.makeText(MainActivity.this, "Clicked On Child",
            Toast.LENGTH_SHORT).show();
    return true;
}
     }

适配器类:

public class NewAdapter extends BaseExpandableListAdapter {

public ArrayList<String> groupItem, tempChild;
public ArrayList<Object> Childtem = new ArrayList<Object>();
public LayoutInflater minflater;
public Activity activity;

public NewAdapter(ArrayList<String> grList, ArrayList<Object> childItem) {
    groupItem = grList;
    this.Childtem = childItem;
}

public void setInflater(LayoutInflater mInflater, Activity act) {
    this.minflater = mInflater;
    activity = act;
}

@Override
public Object getChild(int groupPosition, int childPosition) {
    return null;
}

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

@SuppressWarnings("unchecked")
@Override
public View getChildView(int groupPosition, final int childPosition,
        boolean isLastChild, View convertView, ViewGroup parent) {
    tempChild = (ArrayList<String>) Childtem.get(groupPosition);
    TextView text = null;
    if (convertView == null) {
        convertView = minflater.inflate(R.layout.childrow, null);
    }
    text = (TextView) convertView.findViewById(R.id.textView1);
    text.setText(tempChild.get(childPosition));
    convertView.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
            Toast.makeText(activity, tempChild.get(childPosition),
                    Toast.LENGTH_SHORT).show();
        }
    });
    return convertView;
}

@Override
public int getChildrenCount(int groupPosition) {
    return ((ArrayList<String>) Childtem.get(groupPosition)).size();
}

@Override
public Object getGroup(int groupPosition) {
    return null;
}

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

@Override
public void onGroupCollapsed(int groupPosition) {
    super.onGroupCollapsed(groupPosition);
}

@Override
public void onGroupExpanded(int groupPosition) {
    super.onGroupExpanded(groupPosition);
}

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

@Override
public View getGroupView(int groupPosition, boolean isExpanded,
        View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = minflater.inflate(R.layout.grouprow, null);
    }
    ((CheckedTextView) convertView).setText(groupItem.get(groupPosition));
    ((CheckedTextView) convertView).setChecked(isExpanded);
    return convertView;
}

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

@Override
public boolean isChildSelectable(int groupPosition, int childPosition) {
    return false;
}

【问题讨论】:

    标签: android android-listview expandablelistview baseadapter


    【解决方案1】:

    您必须调用setContentView 传递一个包含ExpandableListView 的布局,其ID 为@android:id/list
    然后,你可以得到这个ExpandableListView 调用getExpandableListView()

    顺便说一句,因为您可以通过 XML 自定义您的 ExpandableListView,所以您不必调用此方法,只会使用 setListAdapter()
    您的活动不必实现OnChildClickListener 并调用setOnChildClickListener,您只需覆盖ExpandableListActivity 的方法onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id)

    请参阅此link 以获取布局示例。
    下次不要忘记发布您遇到的异常的日志。

    【讨论】:

    • 谢谢。如何通过 XML 禁用 GroupIndicator(例如将其设置为 null)?
    • 试试android:groupIndicator="@null"android:groupIndicator="@android:color/transparent"
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 2014-07-09
    • 1970-01-01
    • 2016-06-13
    相关资源
    最近更新 更多