2013-02-15 17 views
10

Ho un problema. Prima della modifica nel mio file XML, la mia listview era in grado di funzionare perfettamente. Ma ora, dopo alcune modifiche in xml, non funziona correttamente. La mia listview è personalizzata. Quindi, ho creato xml separati per rendere ogni singola riga nella listview.fare clic su elemento da listview

Il mio unico row.xml codice:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:id="@+id/relativeLayoutSingleRowManageAddictions" 
    android:layout_height="40dp" 
    android:background="@drawable/box_midbg" > 

    <TextView 
     android:id="@+id/textViewSingleRowManageAddictions" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_centerVertical="true" 
     android:layout_marginLeft="17dp" 
     android:text="TextView" 
     android:textSize="20dp" 
     android:textColor="#ffffff" /> 

    <ImageView 
     android:id="@+id/imageViewSingleRowManageAddictions" 
     android:layout_width="20dp" 
     android:layout_height="20dp" 
     android:layout_alignParentRight="true" 
     android:layout_centerVertical="true" 
     android:layout_marginRight="18dp" 
     android:src="@drawable/listing_arrow" /> 

</RelativeLayout> 

mio main.xml codice in cui risiede ListView:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:background="@drawable/main_bg_edited" > 

    <RelativeLayout 
     android:id="@+id/relativeLayout1" 
     style="@style/top_bar_style" > 

     <ImageView 
      android:id="@+id/imageViewMAnageAddictionsBack" 
      android:layout_width="30dp" 
      android:layout_height="30dp" 
      android:layout_alignParentLeft="true" 
      android:layout_centerVertical="true" 
      android:src="@drawable/back_arrow" 
      android:clickable="true" /> 

     <TextView 
      android:id="@+id/textView1" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      style="@style/header_style" 
      android:text="Manage Addictions" /> 

     <ImageView 
      android:id="@+id/imageViewManageAddictionsAdd" 
      android:layout_width="25dp" 
      android:layout_height="20dp" 
      android:layout_marginRight="3dp" 
      android:layout_alignParentRight="true" 
      android:layout_centerVertical="true" 
      android:src="@drawable/plus_nav" 
      android:clickable="true" /> 

    </RelativeLayout> 

    <ListView 
     android:id="@+id/listViewManageAddictions" 
     android:layout_width="290dp" 
     android:layout_height="fill_parent" 
     android:layout_below="@+id/relativeLayout1" 
     android:layout_centerHorizontal="true" 
     android:layout_centerInParent="true" 
     android:layout_marginTop="12dp" 
     android:divider="@android:color/transparent" 
     android:dividerHeight="2dp" /> 

</RelativeLayout> 

E il mio codice Java per esso:

package com.addictioncounterapp; 

import java.util.ArrayList; 

import android.os.Bundle; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.widget.AdapterView; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 
import android.widget.TextView; 
import android.widget.Toast; 
import android.app.Activity; 
import android.content.Intent; 
import android.database.Cursor; 
import android.database.sqlite.SQLiteDatabase; 

public class ManageAddictionList extends Activity { 
    ImageView iv_manage_addictions_back, iv_manage_addictions_add; 
    ListView listview; 
    ArrayList <String> arraylist_manage_addiction; 
    ArrayAdapter <String> arrayadapter_manage_addiction; 
    SQLiteDatabase database; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_manage_addiction_list); 

    loaddatabase(); 

    iv_manage_addictions_back = (ImageView) findViewById(R.id.imageViewMAnageAddictionsBack); 
    iv_manage_addictions_back.setClickable(true); 
    iv_manage_addictions_back.setOnClickListener(new OnClickListener() {@Override 
     public void onClick(View v) { 
     startActivity(new Intent(ManageAddictionList.this, Settings.class)); 
     } 
    }); 

    iv_manage_addictions_add = (ImageView) findViewById(R.id.imageViewManageAddictionsAdd); 
    iv_manage_addictions_add.setClickable(true); 
    iv_manage_addictions_add.setOnClickListener(new OnClickListener() {@Override 
     public void onClick(View v) { 
     Intent intent = new Intent(ManageAddictionList.this, MainActivity.class); 
     intent.putExtra("name", ""); 
     intent.putExtra("unit", ""); 
     intent.putExtra("attribute", ""); 
     intent.putExtra("limit", ""); 
     intent.putExtra("operation", "Add Addiction"); 
     startActivity(intent); 
     } 
    }); 


    arraylist_manage_addiction = new ArrayList <String>(); 
    manageList(); 
    listview = (ListView) findViewById(R.id.listViewManageAddictions); 

    if (arraylist_manage_addiction.isEmpty()) Toast.makeText(getBaseContext(), "No Addictions found to manage. Click on 'add' button to create new Addiction.", Toast.LENGTH_SHORT) 
     .show(); 
    else listview.setAdapter(arrayadapter_manage_addiction); 

    listview.setOnItemClickListener(new OnItemClickListener() {@Override 
     public void onItemClick(AdapterView <? > arg0, View arg1, int arg2, long arg3) { 
     String name = null, attribute = null, unit = null, limit = null; 

     View parentView = (View) arg0.getParent(); 
     name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)) 
      .getText() + ""; 

     Toast.makeText(getBaseContext(), name, Toast.LENGTH_SHORT) 
      .show(); 

     int cat_id = 0; 

     //--------Fetching cat_id through name from the list-------- 

     Cursor cursor; 

     cursor = database.query("category", new String[] { 
      "cat_id" 
     }, new String("cat_name=?"), new String[] { 
      name 
     }, null, null, null); 

     if (cursor.getCount() > 0) { 
      while (cursor.moveToNext()) 
      cat_id = cursor.getInt(0); 
      cursor.close(); 
     } 

     //--------Fetching unit, attribute, limit through cat_id from the list-------- 

     cursor = database.query("category_attribute", new String[] { 
      "cat_attribute_name", "cat_attribute_unit", "cat_limit" 
     }, new String("cat_id=?"), new String[] { 
      cat_id + "" 
     }, null, null, null); 

     if (cursor.getCount() > 0) { 
      while (cursor.moveToNext()) { 
      attribute = cursor.getString(0); 
      unit = cursor.getString(1); 
      limit = cursor.getString(2); 
      } 
      cursor.close(); 
     } 

     Intent intent = new Intent(ManageAddictionList.this, MainActivity.class); 
     intent.putExtra("name", name); 
     intent.putExtra("unit", unit); 
     intent.putExtra("attribute", attribute); 
     intent.putExtra("limit", limit); 
     intent.putExtra("cat_id", cat_id); 
     intent.putExtra("operation", "Edit Addiction"); 
     startActivity(intent); 
     } 
    }); 
    } 

    private void loaddatabase() { 
    database = openOrCreateDatabase("AddictionCounter.db", SQLiteDatabase.OPEN_READONLY, null); 
    } 

    private void manageList() { 
    String[] columns = { 
     "cat_name" 
    }; 
    Cursor cursor; 

    cursor = database.query("category", columns, null, null, null, null, null); 

    if (cursor.getCount() > 0) { 
     while (cursor.moveToNext()) 
     arraylist_manage_addiction.add(cursor.getString(0)); 
     cursor.close(); 
    } 

    arrayadapter_manage_addiction = new ArrayAdapter <String> (this, R.layout.single_row_manage_addictions, R.id.textViewSingleRowManageAddictions, arraylist_manage_addiction); 
    } 
} 

Il bug principale dietro a questo è che, quando ricevo il nome utilizzando questo:

View parentView = (View) arg0.getParent(); 
name = ((TextView) parentView.findViewById(R.id.textViewSingleRowManageAddictions)).getText()+""; 

ListView di qualsiasi record, si dà il nome di un solo primo record. Ad esempio, se la mia prima riga ha un testo denominato "Gioco", quando clicco su qualsiasi riga, (per il debugging, ho usato Toast.makeText(...)) it Toast "Gioco" come nome per ogni record nella listview, anche se ogni record nel listview è unico. Please help me con questo.

+1

'arg0' è il vostro ListView ... usa' arg1' che è la riga cliccato ... – Selvin

+1

... comunque per oggetto solo ricevono clic è meglio usare 'string name = (String) agr0.getAdapter(). getItem (arg2); ' – Selvin

+0

@Selvin hai ragione. Capito. Apprezzato. –

risposta

46
lv.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

     // selected item 
     String selected = ((TextView) view.findViewById(R.id.your_textView_item_id)).getText().toString(); 

     Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT); 
     toast.show(); 
    } 
}); 
+0

Bello .. rispondi ma come ottenere un evento click sull'elemento differente in onItemClick. Nel mio listview ci sono 5 articoli che voglio eseguire eventi su diversi oggetti cilck .. grazie –

2

Se si desidera onClickListener sul TextView unica, la sua migliore per definire onClickListener l'adattatore stesso. come

yourTextView.setOnClickListener(new View.OnClickListener() { 
     public void onClick(View v) { 
     // showToast() 
     } 
}); 
+1

Anche il tuo metodo è apprezzabile. Ma avevo bisogno di sottintendere l'ascoltatore sull'intero record della lista stessa, non solo sul testo all'interno di esso. La tua opinione è anche vera, in alcuni casi, concordato ... –

1

a parte il sopra soluzione, questo ha funzionato per me stavo affrontando una situazione simile, sono stato in grado di risolverlo dopo ho aggiunto la seguente

android:descendantFocusability="blocksDescendants"

alla mia ListView in XML. Funziona ora. Per l'utente reale curiosi qui c'è di più informazioni su questo http://developer.android.com/reference/android/R.attr.html#descendantFocusability

+1

bel modo alternativo, non sapevo questo. Stavo lottando molto con la visualizzazione delle liste e dei suoi figli. – Deb

+0

Contento che ti abbia aiutato –

3
listView = (ListView)view.findViewById(R.id.list); 
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     String selected = ((TextView) view.findViewById(R.id.complaint)).getText().toString(); 
     Toast.makeText(context,selected,Toast.LENGTH_LONG).show(); 
    } 
}); 
+0

Buon esempio, ho risparmiato tempo! –

0

perché non ho abbastanza fama di commentare qui sto commentando la tua domanda sulla risposta di SKK Basta aggiungere if per il vostro ed eseguire diverse azioni. ..

lv.setOnItemClickListener(new OnItemClickListener() { 
public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

    // selected item 
    String selected = ((TextView) view.findViewById(R.id.your_textView_item_id)).getText().toString(); 

    if(selected.equals("Your comparing string, like Games"){            

    Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT); 
    toast.show(); }                             

    else {            
    if(selected.equals("Your comparing string, like Games")){            
    Toast toast = Toast.makeText(getApplicationContext(), selected, Toast.LENGTH_SHORT); 
    toast.show();}} 


}});             
Problemi correlati