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

Listview OnItemClickListener - nichts passiert

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Tom299, 01.09.2011.

  1. Tom299, 01.09.2011 #1
    Tom299

    Tom299 Threadstarter Android-Experte

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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

    Beiträge:
    237
    Erhaltene Danke:
    64
    Registriert seit:
    20.01.2009
    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

    Beiträge:
    602
    Erhaltene Danke:
    120
    Registriert seit:
    31.08.2011
    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
     

Diese Seite empfehlen