0

同じ CustomAdapter を使用しているアクティビティに複数の ListView があります。私の CustomAdapter では、各 ListView で、条件にある ListView の単一の項目に画像を追加します。

Image On Click Listener (CustomAdapter 内) を管理し、カスタム AlertDialog を表示したいだけです。

しかし、この AlertDialog に ArrayList の内容を描画したいだけです

私はこの最初の解決策を見つけました: プログラムで LinearLayout を作成し、 Dictionary の ArrayList で埋めます

編集:ここにMyAdapterがあります(理解できるように、アダプターをよりシンプルにします):

class MyAdapter extends ArrayAdapter<Drink> 
    {
            LayoutInflater inflat;
            private ArrayList<Drink> items;
            private String sousCategory;

            public MyAdapter(Context context, ArrayList<Drink> objects) 
            {
                super(context, R.layout.activity_sousboissons_list_item_elementsouscategorie, objects);
                this.items = objects;
                this.inflat = LayoutInflater.from(context);
                this.sousCategory = objects.get(0).getType();
            }
           private class ViewHolder{
                public TextView title;
                public TextView prix;
                public TextView desc;
                public TextView size;
                public ImageView img;
                public LinearLayout ll;
            }

           @Override
           public View getView(int position, View convertView, ViewGroup parent) {
               String currentKey = "";
               ViewHolder holder = null;
               Drink element = items.get(position);

               if (convertView == null) {
                       holder = new ViewHolder();
                       convertView = inflat.inflate(R.layout.activity_sousboissons_list_item_elementsouscategorie, null);
                       holder.title = (TextView) convertView.findViewById(R.id.sousboissons_element_title);
                       holder.desc =  (TextView) convertView.findViewById(R.id.sousboissons_element_desc);
                       holder.prix =  (TextView) convertView.findViewById(R.id.sousboissons_element_prix);
                       holder.size = (TextView) convertView.findViewById(R.id.sousboissons_element_size);

                       if (element.getPrice().size() > 1){
                                  EditText editT = new EditText(SousBoisson.this);
                           final AlertDialog.Builder alert = new AlertDialog.Builder(SousBoissonsActivity.this);
                           alert.setTitle(element.getName());
                   alert.setView(e);
                           holder.img.setOnClickListener(new OnClickListener() {
                            @Override
                            public void onClick(View v) {
                                alert.show();
                            }
                        });
                           holder.ll.addView(holder.img);
                       }else{
                       }
                       convertView.setTag(holder);
               } else {
                       holder = (ViewHolder) convertView.getTag();
               }
               if (element != null) {
                   // Here I'm setting all the Text Value of my Labels
                   }
               }
               return convertView;
           }
    }

うまく機能しますが、もう一度クリックするとエラーが発生します:

03-27 19:50:11.007: E/AndroidRuntime(5416): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.view.ViewGroup.addViewInner(ViewGroup.java:3618)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.view.ViewGroup.addView(ViewGroup.java:3489)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.view.ViewGroup.addView(ViewGroup.java:3465)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at com.android.internal.app.AlertController.setupView(AlertController.java:402)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at com.android.internal.app.AlertController.installContent(AlertController.java:242)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.app.AlertDialog.onCreate(AlertDialog.java:336)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.app.Dialog.dispatchOnCreate(Dialog.java:351)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.app.Dialog.show(Dialog.java:256)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.app.AlertDialog$Builder.show(AlertDialog.java:932)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at azur.mobile.incomrestau.SousBoissonsActivity$MyAdapter$1.onClick(SousBoissonsActivity.java:189)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.view.View.performClick(View.java:4211)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.view.View$PerformClick.run(View.java:17267)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.os.Handler.handleCallback(Handler.java:615)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.os.Handler.dispatchMessage(Handler.java:92)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.os.Looper.loop(Looper.java:137)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at android.app.ActivityThread.main(ActivityThread.java:4898)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at java.lang.reflect.Method.invokeNative(Native Method)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at java.lang.reflect.Method.invoke(Method.java:511)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1006)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:773)
03-27 19:50:11.007: E/AndroidRuntime(5416):     at dalvik.system.NativeStart.main(Native Method)

私は子供なので、彼を置き換えることはできないので、それは正常であると読んだことがあります..

alert.setAdapter使う代わりに使おうと思ったalert.setViewけどわからない..

編集:問題は私のものではありませんholder.ll..

4

2 に答える 2

0

うまく機能しますが、もう一度クリックするとエラーが発生します。

IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

これは問題の行のようです:

holder.ll.addView(holder.img);

簡単な修正は、img既に親があるかどうか、およびそれを削除するかどうかを確認することです。

if(holder.img.getParent() != null)
    ((ViewGroup) holder.img.getParent()).removeView(holder.img);
holder.ll.addView(holder.img);
于 2013-03-27T19:01:34.617 に答える
0

ああ、私のimgのOnClickListenerでビューの削除を使用して動作します!!

追加しました:

holder.img.setOnClickListener(new OnClickListener() {
                                @Override
                                public void onClick(View v) {
                                    if(e.getParent() != null)
                                        ((ViewGroup) e.getParent()).removeView(e);
                                    alert.show();
                                }
                            });

:) ありがとう、editText の代わりにカスタムのカスタム レイアウトで動作することを願っています。

于 2013-03-27T23:41:12.983 に答える