2017-03-25 13 views
1

カスタムリスト(image + text)でAlertDialogを実行しようとしています。カスタムアダプターを使用していますが、動作しますが、なぜonClickイベントが機能しないのか分かりません。 私はすでにListViewを作成しようとしていましたが、アダプタを設定してAlertDialogにビューを設定していましたが、まだイベントをキャッチできません。私は間違って何をしていますか?カスタムアダプタでAlertDialogのリスナーをクリック

ArrayList<ItemData> list = ItemData.createFromMaterialArray(materials); 
     MaterialsAdapter adapter = new MaterialsAdapter(this, 
       R.layout.custom_material_item, R.id.text, list); 


     AlertDialog.Builder materialTypesDialog = new AlertDialog.Builder(this); 
     materialTypesDialog.setTitle(R.string.material); 
     materialTypesDialog.setAdapter(adapter, new DialogInterface.OnClickListener() { 
      @Override 
      public void onClick(DialogInterface dialog, int which) { 
       // Nothing happens, why??? 
       Toast.makeText(context, "WORK", Toast.LENGTH_LONG).show(); 
      } 
     }); 

     materialTypesDialog.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
      @Override 
      public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { 
       // Same problem 
       Toast.makeText(context, "WORK", Toast.LENGTH_LONG).show(); 
      } 

      @Override 
      public void onNothingSelected(AdapterView<?> parent) { 

      } 
     }); 

     materialTypesDialog.show(); 

私のアダプタは、私はスピナーのための同様のアダプタを使用し、それは正常に動作します。

class MaterialsAdapter extends ArrayAdapter<ItemData> { 

private int groupId; 

Activity context; 
ArrayList<ItemData> list; 
private LayoutInflater inflater; 

/** 
* @param context 
* @param _groupId 
* @param _id 
* @param list 
*/ 
MaterialsAdapter(Activity context, int _groupId, int _id, ArrayList<ItemData> 
     list) { 
    super(context, _id, list); 
    this.list = list; 
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    this.groupId = _groupId; 
} 

/** 
* @param position 
* @param convertView 
* @param parent 
* @return 
*/ 
public View getView(int position, View convertView, ViewGroup parent) { 

    View itemView = inflater.inflate(groupId, parent, false); 
    ImageView imageView = (ImageView) itemView.findViewById(R.id.image); 

    imageView.setImageResource(list.get(position).getImageId()); 
    TextView textView = (TextView) itemView.findViewById(R.id.text); 
    textView.setText(list.get(position).getTextId()); 

    return itemView; 

} 

/** 
* @param position 
* @param convertView 
* @param parent 
* @return 
*/ 
public View getDropDownView(int position, View convertView, ViewGroup 
     parent) { 
    return getView(position, convertView, parent); 

} 
} 

にItemDataクラス

class ItemData { 

private String id; 
private int textId; 
private int imageId; 

/** 
* @param id 
* @param textId 
* @param imageId 
*/ 
private ItemData(String id, int textId, int imageId) { 
    this.id = id; 
    this.textId = textId; 
    this.imageId = imageId; 
} 

/** 
* @return 
*/ 
int getTextId() { 
    return textId; 
} 

/** 
* @return 
*/ 
int getImageId() { 
    return imageId; 
} 

/** 
* @return 
*/ 
String getId() { 
    return id; 
} 


/** 
* @return 
*/ 
static ArrayList<ItemData> createFromMaterialArray(Material[] materials) { 
    ArrayList<ItemData> itemDataList = new ArrayList<>(); 

    for (Material material : materials) { 

     itemDataList.add(
       new ItemData(material.getName(), 
         material.textID, 
         material.imageID); 
    } 

    return itemDataList; 
}} 

レイアウトcustom_material_item 2つのアイテム(のTextViewとImageViewの)との簡単なLineralLayoutのように見えます。あなたのalertdialogと以下のようなsetOnItemClickListenerからリストビューを取得するための

+0

http://stackoverflow.com/questions/15762905/how-can-i-display-a-list-view-in-an-android-alert-dialogこれが役立ちます。 –

+0

答えをありがとう、私はArrayAdapter を使用するときに動作しますが、カスタムアダプタのOnClickListenerを使用すると機能しません。問題をデバッグする方法を理解できないという事実のように、エラーにはあまり問題はありません。リストの項目をクリックしたときにどのようなイベントが発生したのか分かりません。 – negatiffx

+1

materialTypesDialog.setOnItemSelectedListenerイベントを削除し、このAlertDialogを追加します。alert = materialTypesDialog.create(); alert.show();間違ってダイアログを作成している可能性があります:http://stackoverflow.com/questions/7811117/custom-objects-in-alertdialog-list-how-to-get-a-display-string-and-then-the-act –

答えて

1

問題は私のカスタムアイテムのレイアウトにありました。親のLineralLayoutにClickable = "true"が追加され、OnClickListnerがトリガーされなかった理由があります。

0

試してみてください。

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

     } 
    }); 

または alertDialogを作成して表示するためのコードの下に追加する必要があります。

AlertDialog mAlertDialog = materialTypesDialog.create(); 
mAlertDialog.show(); 

そしてsetOnItemSelectedListenerを削除します。 AlertDialogと連携していません。

+0

答えをありがとう、あなたの答えは正しい方向に私をプッシュしました。私のレイアウトに問題がありました。 – negatiffx

+0

何とかお手伝いします。 – pRaNaY

関連する問題