0

Bienvenue à tousComment travailler avec ExpandableListView?

J'ai un ExpanableListView que je suis en train de tester. J'ai un problème avec l'icône de développement des éléments. L'icône est en cours de superposition sur le titre du texte de chaque élément. Cela signifie que par exemple, si le titre des premiers éléments est "Ducados", l'icône est superposée "Du" et seul "cados" est visible

Que puis-je faire pour aligner le texte sur la droite de l'extension icône?

Voici le code:

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; 
    } 
} 
} 

Merci

Répondre

1

Je me souviens en cours d'exécution dans un problème similaire dans un de mes propres applications.

Dans votre méthode getGenericView, vous pouvez utiliser TextView.setPadding pour spécifier le remplissage gauche du texte afin qu'il apparaisse plus à droite et ne soit pas recouvert par l'icône. Comme la méthode définit le remplissage en pixels (qui varie en fonction de la densité de l'écran), il est important de convertir les pixels en density-independent pixels afin que le remplissage et l'apparence soient standardisés d'un écran à l'autre.

Voici un exemple complet de la méthode de mon propre code:

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; 
} 

Si vous avez plusieurs ExpandableListViews tout au long de votre application, il peut être préférable de spécifier la taille des pixels dans les ressources de votre application (res/valeurs /dimen.xml) plutôt qu'ici en haut de getGenericView, de sorte qu'il est défini (et peut être modifié) en un seul endroit et vous pouvez le référencer dans toutes les listes.

Espérons que cela aide!

+0

Je l'ai essayé, mais le rembourrage est insuffisant sur certains téléphones à grand écran. Et si je mets beaucoup de rembourrage le texte apparaît beaucoup à droite sur les téléphones de résolution d'écran smal. n'existe pas meilleure solution pour cela? – NullPointerException

+0

Hmm, c'est intéressant. Je trouve aussi étrange qu'il n'y ait pas de manière plus intégrée de le faire (et j'aimerais aussi savoir s'il y en a). Sur quels téléphones grand et petit écran testez-vous? Peut-être y a-t-il quelque chose de plus impliqué au-delà de la densité de l'écran. – Aaron