2010-11-05 16 views
0

Je développe une petite application avec une vue de liste remplie d'un composant composé. Ce composant a deux vues de texte et un bouton à l'intérieur. L'un des affichages de texte est invisible et lorsque le bouton est cliqué, il doit apparaître. Je peux montrer la liste mais je ne peux pas rendre le textview visible quand le bouton est cliqué. Voici le code XML du composant:Composant personnalisé listview évolutif avec bouton click

<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"> 
<TextView 
    android:text="@+id/TextView01" 
    android:id="@+id/placeNamwView" 
    android:layout_height="wrap_content" 
    android:textSize="30dp" 
    android:layout_width="wrap_content" 
    android:maxWidth="250dp"> 
    </TextView> 
<Button 
    android:layout_height="wrap_content" 
    android:layout_toRightOf="@+id/placeNamwView" 
    android:layout_width="wrap_content" 
    android:id="@+id/Button01" 
    android:text="More"> 
    </Button> 
<EditText 
    android:layout_below="@+id/placeNamwView" 
    android:layout_height="wrap_content" 
    android:layout_width="wrap_content" 
    android:text="@+id/TextView01" 
    android:id="@+id/placeAddressView" 
    android:textSize="20dp" 
    android:textColor="#FFFF0000" 
    android:maxWidth="250dp"> 
    </EditText> 
</RelativeLayout> 

Et c'est le ArrayAdapter qui remplit la liste:

public class AddressAdapter extends ArrayAdapter<Item> { 

    int resource; 
    RelativeLayout placeView; 
    EditText addressText; 



    public AddressAdapter(Context _context, int _resource, List<Item> _items) { 
     super(_context, _resource, _items); 
     resource = _resource; 
    } 



    private OnClickListener buttonClick = new OnClickListener() { 
    public void onClick (View v) { 
     int i = placeView.findViewById(R.id.stub_import).getVisibility(); 
     visibility(i); 
    } 
    } 


    private void visibility(int i) { 
    // 

    TODO Auto-generated method stub 
    switch(i) { 
     case(View.GONE): 
     addressText.setVisibility(View.VISIBLE); 
     break; 
     case(View.VISIBLE): 
     addressText.setVisibility(View.GONE); 
     break; 
    } 



    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
    Item item = getItem(position); 

    String name = item.getName(); 
    String address = item.getAddress(); 

    if (convertView == null) { 
     placeView = new RelativeLayout(getContext()); 
     String inflater = Context.LAYOUT_INFLATER_SERVICE; 
     LayoutInflater vi = (LayoutInflater)getContext().getSystemService(inflater); 
     vi.inflate(resource, placeView, true); 
    } 
    else 
    { 
     placeView = (RelativeLayout) convertView; 
    } 

    TextView nameText = (TextView)placeView.findViewById(R.id.placeNamwView); 
    Button button = (Button)placeView.findViewById(R.id.Button01); 
    addressText = (EditText)placeView.findViewById(R.id.placeAddressText); 

    button.setOnClickListener(buttonClick); 
    nameText.setText(name); 
    addressText.setText(address); 

    return placeView; 
    } 
} 

Répondre

0

Vous utilisez le même membre de données placeView pour chaque ligne. Par conséquent, votre clic sur le bouton modifie la visibilité TextView dans la dernière ligne traitée par getView(), et non la ligne contenant le bouton sur lequel l'utilisateur a cliqué.

Here is a sample project d'un de mes livres montrant l'utilisation de widgets interactifs dans un ListView (dans ce cas, un RatingBar). Dans mon cas, j'ai utilisé getTag() et setTag(). Dans votre cas, vous pouvez simplement appeler getParent() sur le Button pour commencer à naviguer autour de trouver le bon TextView.

0

Je pense que vous devriez utiliser ce qui suit dans l'état

INVISIBLE 

au lieu de

GONE 

essayer!