0

Wellcome allКак работать с ExpandableListView?

У меня есть 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; 
    } 
} 
} 

Благодаря

ответ

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/значения /dimen.xml), а не здесь в верхней части getGenericView, так что он определен (и может быть изменен) в одном месте, и вы можете ссылаться на него во всех списках.

Надеюсь, это поможет!

+0

Я пробовал, но на некоторых телефонах с большим экраном недостаточно прокладки. И я, если поместить много дополнений, текст появляется много справа на телефонах с разрешением экрана Smal. Не существует лучшего решения для этого? – NullPointerException

+0

Хм, это интересно. Мне тоже кажется странным, что для этого нет более встроенного способа (и мне также было бы интересно узнать, есть ли). На каких телефонах с большим и маленьким экраном вы тестируете? Возможно, есть нечто большее, чем плотность экрана. – Aaron