2013-02-15 15 views
10

問題があります。私のXMLファイルで修正する前に、私のlistviewは完全に動作することができました。しかし、今、xmlのいくつかの変更後、適切に動作しません。 私のリストビューはカスタムです。だから、私はリストビュー内のすべての単一の行をレンダリングする別々のXMLを作成しました。リストビューからクリックしたアイテム

マイ単一row.xmlコード:リストビューが常駐

<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> 

マイmain.xmlコード:

<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> 

そして、それは私のJavaコード:

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); 
    } 
} 

これの主なバグ私はこれを使用して名前を取得するときに、ということである:

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

任意のレコードのリストビューは、それだけで最初のレコードの名前を与えます。 たとえば、私の最初の行に「ゲーム」という名前のテキストビューがある場合、デバッグの目的で、私はToast.makeText(...))を使用しました。トースト「ゲーム」をリストビューのすべてのレコードの名前として使用します。リストビューでユニークです。これで私を助けてください。

+1

'arg0'があなたのListViewである...あなたのクリック行で' arg1'を使用して... – Selvin

+1

は... '文字列名=(String)を使用することをお勧めしますagr0.getAdapter()。getItem(arg2); ' – Selvin

+0

@Selvinあなたは正しいです。わかった。感謝。 –

答えて

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

ニース..答えは、どのようにonItemClickで別のアイテムのクリックイベントを取得する。私のリストビューには、5つのアイテムがあります。私は別のアイテムの塗装にイベントを実行したいです..ありがとう –

2

だけTextViewonClickListenerをしたい場合は、アダプタ自体にonClickListenerを定義することはその優れています。同様

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

あなたの方法も相当です。しかし、私はそれの中のテキストビューだけでなく、リスト全体のレコード自体にリスナーを暗示する必要がありました。あなたの意見は、特定のケースでは、合意にも合っています... –

1

上記の解決策、これは私のために働いた私は似たような状況に直面して私は、XMLの私のリストビューに、次の

android:descendantFocusability="blocksDescendants"

を追加した後、私はそれを解決することができました。それは今働いている。文の場合、私はここにコメントするのに十分な評判を持っていない私はSKKの答えにあなたの質問にコメントしていますので、実際の好奇心旺盛なユーザーにここでその http://developer.android.com/reference/android/R.attr.html#descendantFocusability

+1

良い代替の方法は、これについて知りませんでした。私はリストビューとその子供とたくさんの苦労をしていました。 – Deb

+0

それはあなたを助けてくれてうれしい –

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

良い例、私の時間を節約! –

0

についての詳細情報は、ちょうどあなたと異なるアクションを実行するために追加します。 ...だけクリックGETTING項目についてとにかく

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();}} 


}});             
関連する問題