Problem mit Listview. Item nicht selektierbar

B

Boris0815

Fortgeschrittenes Mitglied
4
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
 
Hat keiner eine Idee? Ich hab schon wild "rumgegooglet" und eigentlich sollte es funktionieren. :(

Gruß

Boris
 
Mit den xml-Dateien allein ist es nicht getan, das wird wohl an Deinem Java-Code liegen.

Gruß Wicki
 
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;
    }
}

...
AccountData[] habenArray = habenData.toArray(new AccountData[habenData.size()]);
AccountDataAdapter adapterHaben = new AccountDataAdapter(this,
R.layout.listview_item_row, habenArray);

habenList.setAdapter(adapterHaben);...

Gruß

Boris
 
Code:
listView.setOnItemClickListener(new OnItemClickListener() {
	@Override
	public void onItemClick(AdapterView<?> av, View v, int index, long arg3) {
		...
		...
		...			
	}
});

hast du aber nicht vergessen, oder? ;-)
 
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
 
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:
The method onItemClick(AdapterView<?>, View, int, long) of type new AdapterView.OnItemClickListener(){} must override a superclass method

Eigentlich passt es, die Methodenparameter stimmen.

Gruß

Boris
 
The method onItemClick(AdapterView<?>, View, int, long) of type new AdapterView.OnItemClickListener(){} must override a superclass method
Das kann verschiedene Ursachen haben. Sieh mal bei Google nach mit Deiner obigen Fehlermeldung.

Gruß Wicki
 
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
 
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;
 
  • Danke
Reaktionen: Boris0815
Hallo Tom,

Evtl. mußt du in Eclipse den java compiler compliance level auf 1.6 ändern...

Das wars. Danke.

Gruß

Boris
 

Ähnliche Themen

J
Antworten
5
Aufrufe
929
swa00
swa00
A
Antworten
10
Aufrufe
1.021
swa00
swa00
S
Antworten
4
Aufrufe
995
Sempervivum
S
Zurück
Oben Unten