【问题标题】:How to work with ExpandableListView?如何使用 ExpandableListView?
【发布时间】:2013-01-22 15:31:26
【问题描述】:

欢迎大家

我有一个我正在测试的 ExpanableListView。我对项目的展开图标有疑问。该图标正在绘制覆盖每个项目的文本标题。这意味着例如,如果第一个项目的标题是“Ducados”,则图标覆盖“Du”,并且只有“cados”可见

如何对齐展开图标右侧的文本?

这是代码:

public class MainActivity extends ExpandableListActivity {
ExpandableListAdapter mAdapter;

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    // Set up our adapter
    mAdapter = new MyExpandableListAdapter();
    setListAdapter(mAdapter);
    registerForContextMenu(getExpandableListView());
}

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
    menu.setHeaderTitle("Sample menu");
    menu.add(0, 0, 0, "Sample action");
}

@Override
public boolean onContextItemSelected(MenuItem item) {
    ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();

    String title = ((TextView) info.targetView).getText().toString();

    int type = ExpandableListView.getPackedPositionType(info.packedPosition);
    if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
        Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos, Toast.LENGTH_SHORT).show();
        return true;
    } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
        int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
        Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show();
        return true;
    }

    return false;
}

public class MyExpandableListAdapter extends BaseExpandableListAdapter {
    // Sample data set.  children[i] contains the children (String[]) for groups[i].
    private String[] groups = { "Names", "Designation", "Gender", "Company" };
    private String[][] children = {
            { "abc", "xyz", "ash", "anu" },
            { "SSE", "TJ", "PM", "SE" },
            { "Male", "Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female Female " },
            { "yyyyyy", "xxxxx" }
    };

    public Object getChild(int groupPosition, int childPosition) {
        return children[groupPosition][childPosition];
    }

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

    public int getChildrenCount(int groupPosition) {
        return children[groupPosition].length;
    }

    public TextView getGenericView() {
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        TextView textView = new TextView(MainActivity.this);
        textView.setLayoutParams(lp);
        textView.setTextSize(20);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        return textView;
    }

    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getChild(groupPosition, childPosition).toString());
        textView.setTextSize(15);
        return textView;
    }

    public Object getGroup(int groupPosition) {
        return groups[groupPosition];
    }

    public int getGroupCount() {
        return groups.length;
    }

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

    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
        TextView textView = getGenericView();
        textView.setText(getGroup(groupPosition).toString());
        return textView;
    }

    public boolean isChildSelectable(int groupPosition, int childPosition) {
        return true;
    }

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

谢谢

【问题讨论】:

    标签: android expandablelistview expandablelistadapter expandable


    【解决方案1】:

    我记得在我自己的一个应用程序中遇到了类似的问题。

    在您的getGenericView 方法中,您可以使用TextView.setPadding 指定文本的左侧填充,使其显示在更右侧,并且不会与图标重叠。由于该方法以像素为单位设置填充(这将根据屏幕的密度而变化),因此将像素转换为density-independent pixels 非常重要,这样填充和外观在屏幕之间是标准化的。

    这是我自己代码中方法的完整示例:

    public TextView getGenericView() {
        // Padding values (in pixels)
        int left = 36; // to avoid being overlapped by the icon
        int right = 0; // not needed
        int top = 15; // space out the list a bit more
        int bottom = top; // space out the list a bit more
    
        // Get density of screen to convert px to dp
        float scale = m_Context.getResources().getDisplayMetrics().density;
    
        // Layout parameters for the ExpandableListView
        AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
    
        TextView textView = new TextView(MyActivity.this);
        textView.setLayoutParams(lp);
        // Center the text vertically
        textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
        // Set the text starting position
        textView.setPadding((int)(left * scale), (int)(top * scale), right, (int)(bottom * scale)); // left, top, right, bottom
        textView.setTextSize(20);
        return textView;
    }
    

    如果您在整个应用程序中有多个 ExpandableListViews,最好在应用程序资源 (res/values/dimen.xml) 中指定像素大小,而不是在 getGenericView 的顶部,以便在一个地方定义(并且可以更改),您可以在所有列表中引用它。

    希望这会有所帮助!

    【讨论】:

    • 我试过了,但是在一些大屏手机上填充不足。而且我如果在小屏幕分辨率手机上放置大量填充文本,则会在右侧出现很多。不存在对此更好的解决方案?
    • 嗯,这很有趣。我也觉得奇怪的是没有更内置的方法来做到这一点(我也有兴趣知道是否有)。您正在测试哪些大屏和小屏手机?也许除了屏幕密度之外,还涉及更多内容。
    猜你喜欢
    • 2013-11-30
    • 1970-01-01
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-28
    • 1970-01-01
    相关资源
    最近更新 更多