1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

Problem mit Listview. Item nicht selektierbar

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Boris0815, 15.07.2012.

  1. Boris0815, 15.07.2012 #1
    Boris0815

    Boris0815 Threadstarter Gewerbliches Mitglied

    Beiträge:
    112
    Erhaltene Danke:
    4
    Registriert seit:
    10.07.2012
    Hallo,

    ich habe eine ListView in meiner App, in der ich gerne durch Click/Touch eine Zeile Selektieren möchte. Ich möchte später auf die Daten dieser Zeile zugreifen können.
    Meine Zeilen lassen sich jedoch nicht selektieren und ich weiß leider nicht warum.

    Meine Listview:
    Code:
        <ListView
            android:id="@+id/habentable"
            android:layout_width="match_parent"
            android:layout_height="300dp"
            android:choiceMode="singleChoice"
            />
    Eine einzelne Zeile besteht aus zwei TextViews:
    Code:
    <TextView android:id="@+id/textViewDescription"
            android:layout_width="200dp"
            android:layout_height="fill_parent"
            android:gravity="center_vertical"
            android:textStyle="bold"
            android:textSize="14dp"
            android:textColor="#000000"
            android:layout_marginTop="2dp"
            android:layout_marginBottom="2dp"
            android:clickable="false"
            android:focusable="false"
            android:focusableInTouchMode="false" />
    
    <TextView android:id="@+id/textViewValue"
            android:layout_width="120dp"
            android:layout_height="fill_parent"
            android:gravity="center_vertical"
            android:textStyle="bold"
            android:textSize="14dp"
            android:textColor="#000000"
            android:layout_marginTop="2dp"
            android:layout_marginBottom="2dp"        
            android:clickable="false"
            android:focusable="false"
            android:focusableInTouchMode="false" />
    Kann mir jemand dabei helfen?

    Gruß

    Boris
     
  2. Boris0815, 16.07.2012 #2
    Boris0815

    Boris0815 Threadstarter Gewerbliches Mitglied

    Beiträge:
    112
    Erhaltene Danke:
    4
    Registriert seit:
    10.07.2012
    Hat keiner eine Idee? Ich hab schon wild "rumgegooglet" und eigentlich sollte es funktionieren. :(

    Gruß

    Boris
     
  3. Wicki12, 16.07.2012 #3
    Wicki12

    Wicki12 Android-Hilfe.de Mitglied

    Beiträge:
    57
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2012
    Mit den xml-Dateien allein ist es nicht getan, das wird wohl an Deinem Java-Code liegen.

    Gruß Wicki
     
  4. Boris0815, 16.07.2012 #4
    Boris0815

    Boris0815 Threadstarter Gewerbliches Mitglied

    Beiträge:
    112
    Erhaltene Danke:
    4
    Registriert seit:
    10.07.2012
    Hallo,

    dann ist hier mein verwendeter Adapter und seine Implementierung:

    Code:
    public class AccountDataAdapter extends ArrayAdapter<AccountData>{
    
        Context context;
        int layoutResourceId;   
        AccountData data[] = null;
       
        public AccountDataAdapter(Context context, int layoutResourceId, AccountData[] data) {
            super(context, layoutResourceId, data);
            try {
                this.layoutResourceId = layoutResourceId;
                this.context = context;
                this.data = data;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            try {
                View row = convertView;
                AccountDataHolder holder = null;
          
                if(row == null)
                {
                    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
                    row = inflater.inflate(layoutResourceId, parent, false);
                   
                    holder = new AccountDataHolder();
                    holder.txtDescription = (TextView)row.findViewById(R.id.textViewDescription);
                    holder.txtValue = (TextView)row.findViewById(R.id.textViewValue);
                   
                    row.setTag(holder);
                }
                else
                {
                    holder = (AccountDataHolder)row.getTag();
                }
          
                AccountData accData = data[position];
                holder.txtDescription.setText(accData.getDescription());
                holder.txtValue.setText(Float.toString(accData.getPrice()));
          
                return row;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                return null;
            }
        }
       
        static class AccountDataHolder
        {
            TextView txtDescription;
            TextView txtValue;
        }
    }
    Gruß

    Boris
     
  5. Tom299, 16.07.2012 #5
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Code:
    listView.setOnItemClickListener(new OnItemClickListener() {
    	@Override
    	public void onItemClick(AdapterView<?> av, View v, int index, long arg3) {
    		...
    		...
    		...			
    	}
    });
    
    hast du aber nicht vergessen, oder? ;-)
     
  6. Wicki12, 16.07.2012 #6
    Wicki12

    Wicki12 Android-Hilfe.de Mitglied

    Beiträge:
    57
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2012
    Hallo Boris,

    ich schick Dir mal eine stark verkürzte lauffähige Fassung eines Beispiels, das von Android Development Tutorial stammt. Das ist eine einfache ListView, in der sich jede Zeile anklicken läßt und wo deren Text angezeigt wird.
    Code:
    import java.util.ArrayList;
    
    import android.app.Activity;
    import android.graphics.Color;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.AdapterView;
    import android.widget.ArrayAdapter;
    import android.widget.ListView;
    import android.widget.Toast;
    
    /*
     * Layout:
     *   main.xml enthält nur 1 ListView-Element:
    
    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:orientation="vertical"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      
        <ListView android:layout_width="fill_parent" 
          android:layout_height="fill_parent" 
          android:id="@+id/mainListView">
        </ListView>
    </LinearLayout>
    
     */
    public class ListViewActivity extends Activity {
      
      private ListView mainListView ;
      private ArrayAdapter<String> listAdapter ;
      private ArrayList<String> modelList;
      String[] elemente = {"Mercury", "Venus", "Earth", "Mars"
                              ,"Jupiter", "Saturn" ,"Uranus", "Neptune"
                              ,"Ceres", "Pluto", "Haumea", "Makemake"
                              ,"Eris"
      };
      View previousItem=null;
      
      /** Called when the activity is first created. */
      @Override
      public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        // Find the ListView resource.
        mainListView = (ListView) findViewById( R.id.mainListView );
        mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
          @Override
          public void onItemClick( AdapterView<?> parent, View item, 
                                   int position, long id) {
              String tvw = listAdapter.getItem( position ); //Text der Listenzeile
              setBgColor(item); //aktuelle Zeile hervorheben
              Toast.makeText(getApplicationContext(), "**** "+tvw, Toast.LENGTH_SHORT).show();
          }
        });
        
        // Create and populate models.
        modelList = new ArrayList<String>();
        for (String element: elemente) {
            modelList.add(element);
        }
        
        // Set our custom array adapter as the ListView's adapter.
        listAdapter = new ArrayAdapter<String>( this,
    //          von Android bereitgestellte Layouts
                android.R.layout.simple_list_item_1, android.R.id.text1, modelList);
        mainListView.setAdapter( listAdapter );
      }
    
      //angeklickte Zeile färben
      void setBgColor(View item) {
        if (previousItem != null) {
          previousItem.setBackgroundColor(Color.BLACK);
        }
        item.setBackgroundColor(Color.BLUE);
        previousItem =item;
      }
    }
    
    Gruß Wicki
     
  7. Boris0815, 16.07.2012 #7
    Boris0815

    Boris0815 Threadstarter Gewerbliches Mitglied

    Beiträge:
    112
    Erhaltene Danke:
    4
    Registriert seit:
    10.07.2012
    Hmm ich bin wohl etwas verwöhnt durch die .NET-Welt und WPF, da ist das Binding etwas angenehmer. :)

    Naja hab es hinzugefügt bekomm nun aber eine Fehlermeldung, dass ich nicht die richtige Methode überschreibe.

    Code:
            
    ...    
    habenList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick( AdapterView<?> parent, View item, 
                                             int position, long id) {
                        selectedHaben = adapterHaben.getItem( position ); 
                        setBgColor(item); 
                    }
                  });
    ...
    Fehlermeldung:
    Eigentlich passt es, die Methodenparameter stimmen.

    Gruß

    Boris
     
  8. Wicki12, 16.07.2012 #8
    Wicki12

    Wicki12 Android-Hilfe.de Mitglied

    Beiträge:
    57
    Erhaltene Danke:
    0
    Registriert seit:
    04.04.2012
    Das kann verschiedene Ursachen haben. Sieh mal bei Google nach mit Deiner obigen Fehlermeldung.

    Gruß Wicki
     
  9. Boris0815, 16.07.2012 #9
    Boris0815

    Boris0815 Threadstarter Gewerbliches Mitglied

    Beiträge:
    112
    Erhaltene Danke:
    4
    Registriert seit:
    10.07.2012
    Hab ich natürlich schon gegoogled, aber leider ohne Erfolg. :(
    Ich hab genau die imports wie in den Beispielen. Die Methodenparameter passen auch.
    Hab sogar eclipse die Methode selber erstellen lassen (Strg+space).
    Leider alles ohne Erfolg.

    Gruß

    Boris
     
  10. Tom299, 17.07.2012 #10
    Tom299

    Tom299 Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    Evtl. mußt du in Eclipse den java compiler compliance level auf 1.6 ändern, falls bei dir dort was kleineres (1.5, 1.4) steht. Was anderes fällt mir jetzt auch nicht dazu ein.

    Imports sind denke ich richtig, aber kannst ja nochmal checken:
    import android.widget.ListView;
    import android.widget.AdapterView;
    import android.widget.AdapterView.OnItemClickListener;
     
    Boris0815 bedankt sich.
  11. Boris0815, 17.07.2012 #11
    Boris0815

    Boris0815 Threadstarter Gewerbliches Mitglied

    Beiträge:
    112
    Erhaltene Danke:
    4
    Registriert seit:
    10.07.2012
    Hallo Tom,

    Das wars. Danke.

    Gruß

    Boris
     

Diese Seite empfehlen