1. Tom299, 01.09.2011 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    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
     
  2. Tom299, 01.09.2011 #2
    Tom299

    Tom299 Threadstarter Android-Experte

    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?
     
  3. sixi, 01.09.2011 #3
    sixi

    sixi Erfahrener Benutzer

    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).
     
    Tom299 bedankt sich.
  4. Tom299, 01.09.2011 #4
    Tom299

    Tom299 Threadstarter Android-Experte

    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
     
Die Seite wird geladen...
Ähnliche Themen - Listview OnItemClickListener nichts Forum Datum
[ERLEDIGT] Listview mit Datenbank über Custom ArrayList verbinden Android App Entwicklung 22.04.2017
[ERLEDIGT] Drawer mit scrollbarem Listview Android App Entwicklung 27.03.2017
ListView fix am unteren Bildschirmrand ausgeben Android App Entwicklung 01.03.2017
ProgressBar in ListView Android App Entwicklung 03.01.2017
ListView Element an eine Datenbank senden Android App Entwicklung 04.12.2016
ListView Items verknüpfen Android App Entwicklung 06.10.2016
AlertDialog Listview mit ContextMenu Android App Entwicklung 01.10.2016
Android Listview Search Filter Android App Entwicklung 03.09.2016
ListView zeigt letzten Eintrag bei LongClickEvent nicht vollständig an Android App Entwicklung 26.08.2016
Rahmen um gleiche Einträge in einer ListView Android App Entwicklung 25.08.2016

Besucher kamen mit folgenden Begriffen auf unsere Seite:

  1. android checkbox listview onitemclick