2012-06-26 2 views
7

私は連絡先同期を使用してアプリを作った。写真、名前、番号で以下の連絡先を記載します。私は正常にすべてのものをリストに入れますListViewしかし、ListViewをクリックすることはできません。それはロックされたように見えます、それをクリックすることができません。アンドロイドでListViewをクリックできませんか?

しかし私は別の活動に同じ手順をしました。カスタムListViewを使用していますが、このビューをクリックすると正常に動作します。

何が問題ですか?ここにサンプルコードがあります:

ListView settingsList = (ListView) findViewById(R.id.manage_track_listView); 
    ArrayList<ContactList> MySettingsList = new ArrayList<ContactList>(); 

    ContactList setting1 = new ContactList("contact name 1", "Number 1", null); 
    ContactList setting2 = new ContactList("contact name 2", "Number 2", null); 
    ContactList setting3 = new ContactList("contact name 3", "Number 3", null); 

    MySettingsList.add(setting1); 
    MySettingsList.add(setting2); 
    MySettingsList.add(setting3); 

    ContactList list[] = new ContactList[MySettingsList.size()]; 

    for(int i=0;i<MySettingsList.size();i++) { 

     ContactList mySettings = MySettingsList.get(i); 
     list[i] = new ContactList(mySettings.getName(), mySettings.getNumber(), mySettings.getImageIcon()); 
    } 

    ContactListAdapter adapter = new ContactListAdapter(this, R.layout.manage_track_list_custom_view, list); 
    settingsList.setAdapter(adapter); 
    System.out.println("before listener"); 
    settingsList.setOnItemClickListener(new OnItemClickListener() { 

     @Override 


     public void onItemClick(AdapterView<?> parent, View view, int position, 
       long id) { 
      // TODO Auto-generated method stub 

      System.out.println("Clicked " + position); 
     } 
    }); 
    System.out.println("after listener"); 

ここで、ContactListはimageBlobの連絡先名、番号、およびバイト[]を持つクラスです。イメージがヌルの場合は、デフォルトのic_launcherを連絡先イメージとして設定します。アダプタクラスは次のとおりです。

public class ContactListAdapter extends ArrayAdapter<ContactList> { 

    Context context; 
    int layoutResourceId; 
    ContactList objects[] = null; 

    View row; 

    public ContactListAdapter(Context context, int layoutResourceId, ContactList[] objects) { 
     super(context, layoutResourceId, objects); 
     // TODO Auto-generated constructor stub 

     this.context = context; 
     this.layoutResourceId = layoutResourceId; 
     this.objects = objects; 
     System.out.println(objects[1].getName()); 
     System.out.println(objects[1].getNumber()); 
     System.out.println(objects[1].getImageIcon()); 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     // TODO Auto-generated method stub 

     row = convertView; 
     final ContactListHolder holder; 

     if (row == null) { 

      LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 
      row = inflater.inflate(layoutResourceId, parent, false); 

      holder = new ContactListHolder(); 
      holder.image = (ImageView) row.findViewById(R.id.contactImage); 
      holder.name  = (TextView) row.findViewById(R.id.contactName); 
      holder.number = (TextView) row.findViewById(R.id.contactNumber); 
      holder.check = (CheckBox) row.findViewById(R.id.selectedContact); 

      row.setTag(holder); 

     } else { 

      holder = (ContactListHolder)row.getTag(); 
     } 

     ContactList contact = objects[position]; 
     if(contact.imageIcon != null) { 

      Bitmap imgBitmap = BitmapFactory.decodeByteArray(contact.imageIcon, 0, contact.imageIcon.length); 
      holder.image.setImageBitmap(imgBitmap); 
     } else { 

      holder.image.setImageResource(R.drawable.ic_launcher); 
     } 

     holder.name.setText(contact.name); 
     holder.number.setText(contact.number); 
     holder.check.setChecked(objects[position].isSelected());  

     return row; 

    } 

    static class ContactListHolder { 

     ImageView image; 
     TextView name; 
     TextView number; 
     CheckBox check; 
    } 
} 

私は100人の以上の連絡先がこれだけ3オブジェクトを追加しました。この連絡先リストでは、連絡先イメージ、名前、番号を正常に受信します。

問題はですListViewはクリックできません。私のいずれかが私を導くことを願っています。前もって感謝します。


ありがとうございます。すべての子ビューにandroid:focusable="false"を追加するだけで結果が得られました。 URの案内に感謝します。

答えて

8

子ビューでは、常にすべてのタッチイベントが最初に取得されます。親ビュー(あなたの場合はlistView行)でタッチイベントを取得するには、子イベントに対してfalseを返すか、マニフェストでandroid:clickable="false"に設定する必要があります。あなたの行レイアウトの

+0

この方法は機能していませんか?他の解決策 – Amarnath

+0

ありがとうございました。 – Amarnath

+0

答えが返ってくるのを気軽に聞いてください – thepoosh

7

ImageViewの、TextViewに、チェックボックスなどのように、それぞれの子ビューの

android:focusable="false" 

android:clickable="false" 

を追加...はmanage_track_list_custom_view.xml手段

3

Iたとえば、クリック可能なものをすべて設定する必要があると思います。チェックボックス、ボタンなどを(アダプタクラス内で)フォーカスできないようにします。

 holder.yourButton.setFocusable(false); 
     holder.yourButton.setFocusableInTouchMode(false); 

     holder.yourCheckbox.setFocusable(false); 
     holder.yourCheckbox.setFocusableInTouchMode(false); 
0

onclick listnerをContactListAdapterクラスのView行に設定できます。

holder.check.setChecked(objects[position].isSelected());  
     row.setOnclickListner(new Onclicklistner(){ 
      // Your code here 
     }); 
    return row; 
1

これを試してみてください:

リストビューを追加すると、

setDescendantFocusability(FOCUS_BLOCK_DESCENDANTS); 

を呼び出す詳細は一見hereを持っています。

+1

これは答えとしてマークする必要があります。リストビュー内のアイテムをリストアイテム自体と同時にクリックしてイベントを受け取ることができるためです。 – lfxgroove

0

リストビューでアイテムの他の部分をクリックできない場合、同じアイテム内のテキストビューまたはイメージビューをクリックするだけで同じ問題が発生します。だから私は、私のTextViewを設定します。

android:layout_width="fill_parent" 

このように私のアイテム:私はTextViewにクリックしますので

<relative> 
[image][textview] 
relative/> 

し、イベントをクリックすると、うまく働きました。希望は誰もが同じ問題を抱えているのを助けるでしょう。

関連する問題