Listview OnItemClickListener - nichts passiert

T

Tom299

Stammgast
Threadstarter
Hallo,

ich habe das Problem, daß mein OnItemClickListener nicht funktioniert, und ich finde einfach nicht den Fehler. Vielleicht kann mir jemand von euch weiterhelfen.

Hier mein (aktueller) Code:
Code:
import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TableLayout;
import android.widget.TableRow;
import android.widget.TextView;
import android.widget.Toast;


public class TableView extends Activity {

    private ArrayList<DBItem> dbItems;
    //private ArrayAdapter<DBItems> itemsAdapter;
    private DBItemArrayAdapter itemsAdapter;
    
    private DBItem selectedDBItem;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        LinearLayout layout = new LinearLayout(this);
        layout.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
        layout.setOrientation(LinearLayout.VERTICAL);

        setContentView(layout);
        
        LayoutInflater inflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        //LinearLayout layoutHeader = (LinearLayout)inflater.inflate(R.layout.table_header, null);
        TableLayout layoutHeader = (TableLayout)inflater.inflate(R.layout.table_header_new, null);
        
        TextView tvHeaderDatum = (TextView)layoutHeader.findViewById(R.id.tv_head_datum);
        if (tvHeaderDatum != null) {
            tvHeaderDatum.setText("DateX");
            tvHeaderDatum.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    selectedDBItem = dbItems.get(0);
                    Toast itemToast = Toast.makeText(getApplicationContext(), selectedDBItem.getName() + " " + selectedDBItem.getVorname(), Toast.LENGTH_SHORT);
                    itemToast.show();                    
                }
            });
        }
        
        TableRow row = (TableRow)layoutHeader.findViewById(R.id.header_row);
        if (row != null) {
            row.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    selectedDBItem = dbItems.get(0);
                    Toast itemToast = Toast.makeText(getApplicationContext(), selectedDBItem.getName() + " " + selectedDBItem.getVorname(), Toast.LENGTH_SHORT);
                    itemToast.show();                    
                }
            });            
        }
        
        //LinearLayout layoutItem = (LinearLayout)inflater.inflate(R.layout.table_item, null);
        //RelativeLayout layoutItem = (RelativeLayout)inflater.inflate(R.layout.table_item, null);
        //TableLayout layoutItem = (TableLayout)inflater.inflate(R.layout.table_item_new, null);
        
        layout.addView(layoutHeader);
        //layout.addView(layoutItem);
        
        ListView listView = new ListView(this);
        listView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
        
        dbItems = new ArrayList<DBItem>();
        
        dbItems.add(new DBItem("1", "Schmidt", "Josef", "29.09.1972", true));
        dbItems.add(new DBItem("20", "Müller", "Andreas", "19.07.1974", false));
        dbItems.add(new DBItem("300", "Meier", "Peter", "09.05.1976", true));
        dbItems.add(new DBItem("4000", "Huber", "Paul", "21.03.1969", false));
        dbItems.add(new DBItem("50000", "Keller", "Markus", "11.12.1988", true));
        
        //itemsAdapter = new ArrayAdapter<DBItems>(this, R.layout.table_item, R.id.tv_item_id, dbItems);
        //itemsAdapter = new DBItemArrayAdapter(this, R.layout.table_item_new, dbItems);
        itemsAdapter = new DBItemArrayAdapter(this, R.layout.table_item, dbItems);
        listView.setAdapter(itemsAdapter);
        
        listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView av, View v, int index, long arg3) {
                System.out.println("ItemClicked");
                selectedDBItem = dbItems.get(index);
                if (selectedDBItem != null) {
                    Toast itemToast = Toast.makeText(getApplicationContext(), selectedDBItem.getName() + " " + selectedDBItem.getVorname(), Toast.LENGTH_SHORT);
                    itemToast.show();
                }
            }
        });
        
        layout.addView(listView);
    }
    
}
mein ArrayAdapter:
Code:
import java.util.List;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.TableLayout;
import android.widget.TextView;


public class DBItemArrayAdapter extends ArrayAdapter<DBItem> {

    int resource;
    
    
    public DBItemArrayAdapter(Context context, int resourceId, List<DBItem> dbItems) {
        super(context, resourceId, dbItems);
        this.resource = resourceId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //LinearLayout dbItemsView;
        TableLayout dbItemsView;
        DBItem item = getItem(position);
        
        if (convertView == null) {
            //dbItemsView = new LinearLayout(getContext());
            dbItemsView = new TableLayout(getContext());
            LayoutInflater inflater = (LayoutInflater)getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            inflater.inflate(resource, dbItemsView, true);            
        }
        else {
            //dbItemsView = (LinearLayout)convertView;
            dbItemsView = (TableLayout)convertView;
        }
        
        TextView id = (TextView)dbItemsView.findViewById(R.id.tv_item_id);
        TextView name = (TextView)dbItemsView.findViewById(R.id.tv_item_name);
        TextView vorname = (TextView)dbItemsView.findViewById(R.id.tv_item_vorname);
        TextView datum = (TextView)dbItemsView.findViewById(R.id.tv_item_datum);
        CheckBox flag = (CheckBox)dbItemsView.findViewById(R.id.chk_item_flag);
        
        id.setText(item.getId());
        name.setText(item.getName());
        vorname.setText(item.getVorname());
        datum.setText(item.getDatum());
        flag.setChecked(item.isFlag());
        
        return dbItemsView;
    }
    
}
xml-header:
Code:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      <TableRow 
        android:id="@+id/header_row" 
          android:layout_width="fill_parent" 
         android:layout_height="wrap_content">
        <TextView 
            android:layout_width="0dp"
            android:layout_weight="1.5"
            android:layout_height="wrap_content" 
            android:id="@+id/tv_head_id" 
            android:layout_marginLeft="3dp"
            android:text="@string/table_head_id">
        </TextView>
        <TextView 
            android:id="@+id/tv_head_name" 
            android:layout_width="0dp"
            android:layout_weight="2"
            android:layout_height="wrap_content" 
            android:layout_marginLeft="3dp" 
            android:text="@string/table_head_name">
        </TextView>
        <TextView 
            android:id="@+id/tv_head_vorname" 
            android:layout_width="0dp"
            android:layout_weight="2" 
            android:layout_height="wrap_content" 
            android:layout_marginLeft="3dp" 
            android:text="@string/table_head_vorname">
        </TextView>
        <TextView 
            android:id="@+id/tv_head_datum" 
            android:layout_width="0dp"
            android:layout_weight="2" 
            android:layout_height="wrap_content" 
            android:layout_marginLeft="3dp" 
            android:text="@string/table_head_datum">
        </TextView>
        <TextView 
            android:id="@+id/tv_head_flag" 
            android:layout_width="0dp"
            android:layout_weight="1" 
            android:layout_height="wrap_content" 
            android:layout_marginLeft="3dp" 
            android:text="@string/table_head_flag">
        </TextView>
    </TableRow>
</TableLayout>
und xml-item:
Code:
<?xml version="1.0" encoding="utf-8"?>
<TableLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
      <TableRow
          android:id="@+id/item_row" 
        android:layout_width="fill_parent" 
           android:layout_height="wrap_content">
          <TextView 
            android:text="id" 
            android:id="@+id/tv_item_id" 
            android:layout_width="0dp"
            android:layout_weight="1.5" 
            android:layout_height="wrap_content" 
            android:paddingLeft="3dp">
           </TextView>
        <TextView 
            android:text="name" 
            android:id="@+id/tv_item_name" 
            android:layout_width="0dp"
            android:layout_weight="2" 
            android:layout_height="wrap_content" 
            android:paddingLeft="3dp">
           </TextView>
        <TextView 
            android:text="vorname" 
            android:id="@+id/tv_item_vorname" 
            android:layout_width="0dp"
            android:layout_weight="2"
            android:layout_height="wrap_content" 
            android:paddingLeft="3dp">
           </TextView>
        <TextView 
            android:text="datum" 
            android:id="@+id/tv_item_datum" 
            android:layout_width="0dp"
            android:layout_weight="2" 
            android:layout_height="wrap_content" 
            android:paddingLeft="3dp">
           </TextView>
        <CheckBox 
            android:id="@+id/chk_item_flag" 
            android:layout_width="0dp"
            android:layout_weight="1" 
            android:layout_height="wrap_content" 
            android:paddingLeft="3dp">
           </CheckBox>    
      </TableRow>
</TableLayout>
Wie man sieht, habe ich auch im header-bereich ein paar item-click-tests eingebaut, und die funktionieren, sowohl für eine TextView, als auch für die ganze TableRow. Aber der Listener für die Listview will einfach nicht, und wie will ich ohne diesen an die selektierte Zeile rankommen?


Grüße,
Tom
 
T

Tom299

Stammgast
Threadstarter
Also wenn ich den Standard-Array-Adapter benutze und dann als Resource android.R.layout.simple_list_item_1 verwende, dann kommt der Klick an.

Kann mir jemand sagen, ob ich das Klickereignis evtl. in meiner XML-Layout-Datei noch zulassen muß? Oder woran könnte es sonst noch liegen?
 
S

sixi

Fortgeschrittenes Mitglied
Ja kann ich :)

Die Checkbox, die du in den Rows verwendest "schluckt" den OnClick.
Als Lösung kannst du einen OnTouchListener auf den View der Rows setzen (also in deinen Adapter in die getView(...)-Methode auf den View den du zurückgibst).
 
T

Tom299

Stammgast
Threadstarter
Vielen dank, auf die Idee wär ich nie gekommen, daß die CheckBox der Übeltäter ist ;-)

Dabei hab ich sie nur mal zum Spaß eingebaut. Aber evtl. will ich später wirklich mal ne Checkbox in der Liste haben, und dann ist das doch gut zu wissen :)

Danke nochmals!

LG Tom
 
Oben Unten