2015-09-29 2 views
1

Я пытаюсь создать диалог с пользовательским списком внутри. Но я получаю эту ошибку: «У указанного ребенка уже есть родительский элемент. Сначала вы должны вывести removeView() родительского элемента ребенка».Android Dialog с пользовательским списком ListView

ActivityCode:

public class ConfigActivity extends ActionBarActivity { 

    //... onCreate and blablabla 

    public void onClickUsoDados(View view) { 
     final ArrayList<CustomItem> data = init();//init() just get some data 

     CustomListAdapter adapter = new CustomListAdapter(this, data); 

     View v = ConfigActivity.this.getLayoutInflater().inflate(R.layout.layout_config_userdata_listview, null, true); 

     list = (ListView) v.findViewById(R.id.listView1); 
     list.setAdapter(adapter); 

     list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, 
            int position, long id) { 
       String Slecteditem = data.get(position).nome; 
       Toast.makeText(ConfigActivity.this, Slecteditem, Toast.LENGTH_SHORT).show(); 

      } 
     }); 

     final Dialog dialogOut = new Dialog(ConfigActivity.this); 

     dialogOut.setContentView(list); 
     dialogOut.setCancelable(true); 
     dialogOut.setTitle("Dados"); 
     dialogOut.buNeutralButton("Voltar", 
       new DialogInterface.OnClickListener() { 
        @Override 
        public void onClick(DialogInterface dialog, int which) { 
         dialogOut.dismiss(); 
        } 
       }); 

     dialogOut.show(); 
    } 
} 

CustomItem.java

public class CustomItem { 
    public String usuario; 
    public String nome; 
    public String curso; 
} 

CustomListAdapter.java

public class CustomListAdapter extends ArrayAdapter<CustomItem> { 

    private Activity context; 
    private ArrayList<CustomItem> data; 

    public CustomListAdapter(Activity context, ArrayList<CustomItem> item) { 
     super(context, R.layout.layout_config_userdata_row, item); 

     this.context = context; 
     this.data = item; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     CustomItem user = getItem(position); 

     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.layout_config_userdata_row, parent, true); 
     } 

     TextView uUsername = (TextView) convertView.findViewById(R.id.textViewListViewUsuario); 
     TextView uName = (TextView) convertView.findViewById(R.id.textViewListViewNome); 
     TextView uCurso = (TextView) convertView.findViewById(R.id.textViewListViewCurso); 

     uUsername.setText(user.usuario); 
     uName.setText(user.nome); 
     uCurso.setText(user.curso); 
     return convertView; 

    } 
} 

Я получаю эту ошибку на "dialogOut.show();», или, если я использую строитель, я получаю эту ошибку на "dialog.create()" Мысли

EDIT1:.? XML-файлы ...

layout_config_userdata_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout //stuff> 

    <LinearLayout <!--stuff-->> 
     <LinearLayout <!--stuff-->> 
      <LinearLayout <!--stuff-->> 
       <TextView <!--stuff-->/> 
       <TextView 
        android:id="@+id/textViewListViewUsuario" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="userToLogin" 
        android:textAppearance="?android:attr/textAppearanceMedium" /> 
      </LinearLayout> 
     </LinearLayout> 

     <LinearLayout <!--stuff-->> 
      <LinearLayout <!--stuff-->> 
       <TextView <!--stuff-->/> 
       <TextView 
        android:id="@+id/textViewListViewNome" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="nomeUser" 
        android:textAppearance="?android:attr/textAppearanceMedium" /> 
      </LinearLayout> 
     </LinearLayout> 

     <LinearLayout <!--stuff-->> 
      <LinearLayout <!--stuff-->> 
       <TextView <!--stuff-->/> 
       <TextView 
        android:id="@+id/textViewListViewCurso" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:text="cursoNome" 
        android:textAppearance="?android:attr/textAppearanceMedium" /> 
      </LinearLayout> 
     </LinearLayout> 
    </LinearLayout> 

    <FrameLayout <!--stuff-->> 
     <ImageView <!--stuff-->/> 
    </FrameLayout> 
</LinearLayout> 

И layout_config_userdata_listview.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent"> 
    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 
</LinearLayout> 

EDIT2: Трассировка стека.

09-29 12:50:24.073 19813-19813/com.ztesteconfig E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    java.lang.IllegalStateException: Could not execute method of the activity 
      at android.view.View$1.onClick(View.java:3680) 
      at android.view.View.performClick(View.java:4191) 
      at android.view.View$PerformClick.run(View.java:17229) 
      at android.os.Handler.handleCallback(Handler.java:615) 
      at android.os.Handler.dispatchMessage(Handler.java:92) 
      at android.os.Looper.loop(Looper.java:137) 
      at android.app.ActivityThread.main(ActivityThread.java:4960) 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
      at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.reflect.InvocationTargetException 
      at java.lang.reflect.Method.invokeNative(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:511) 
      at android.view.View$1.onClick(View.java:3675) 
            at android.view.View.performClick(View.java:4191) 
            at android.view.View$PerformClick.run(View.java:17229) 
            at android.os.Handler.handleCallback(Handler.java:615) 
            at android.os.Handler.dispatchMessage(Handler.java:92) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4960) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
            at dalvik.system.NativeStart.main(Native Method) 
    Caused by: java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first. 
      at android.view.ViewGroup.addViewInner(ViewGroup.java:3439) 
      at android.view.ViewGroup.addView(ViewGroup.java:3310) 
      at android.view.ViewGroup.addView(ViewGroup.java:3286) 
      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:337) 
      at com.android.internal.policy.impl.PhoneWindow.setContentView(PhoneWindow.java:327) 
      at android.app.Dialog.setContentView(Dialog.java:480) 
      at com.ztesteconfig.ConfigActivity.onClickUsoDados(ConfigActivity.java:334) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at android.view.View$1.onClick(View.java:3675) 
            at android.view.View.performClick(View.java:4191) 
            at android.view.View$PerformClick.run(View.java:17229) 
            at android.os.Handler.handleCallback(Handler.java:615) 
            at android.os.Handler.dispatchMessage(Handler.java:92) 
            at android.os.Looper.loop(Looper.java:137) 
            at android.app.ActivityThread.main(ActivityThread.java:4960) 
            at java.lang.reflect.Method.invokeNative(Native Method) 
            at java.lang.reflect.Method.invoke(Method.java:511) 
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1038) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:805) 
            at dalvik.system.NativeStart.main(Native Method) 

на com.ztesteconfig.ConfigActivity.onClickUsoDados (ConfigActivity.java:334) это точно "dialogOut.show();"

+0

Пожалуйста, пост полный стек трассировки, а также с файлом макета, соответствующим 'R.layout.layout_config_userdata_listview'. – CommonsWare

+0

Я добавил файлы xml, см. Его сейчас – PMateus

ответ

1

ОК, так что, давайте обзор:

  • Ваше сообщение об ошибке "указанный вид уже имеет родителя"

  • Ваш макет имеет LinearLayout что вы не используете

  • Ваш код Java специально не обращая внимания, что LinearLayout

Таким образом, избавиться от LinearLayout от ресурса макета. Вы не используете его. Тебе это не нужно. И, это источник вашей ошибки, так как ListView не может и быть в LinearLayoutи в окне просмотра содержимого диалогового окна.

С другой стороны, если у вас есть долгосрочное видение, в котором вы нуждаетесь, что LinearLayout, поставить LinearLayout как вид содержимого диалогового окна, не ListView внутри LinearLayout.

+0

Это общий смысл. Я изменяю содержание в диалоговом окне на «LinearLayout» вместо «ListView» и получил ошибку в строке «convertView = LayoutInflater.from (getContext()). Inflate (R.layout.layout_config_userdata_row, parent, true); ', я не могу вспомнить ошибку прямо сейчас, но я меняю эту строку на' convertView = context.getLayoutInflater(). inflate (R.layout.layout_config_userdata_row, null, false); 'и работает как шарм – PMateus

0

Попробуйте

if(view.getParent()!=null) 
((ViewGroup)view.getParent()).removeView(v); 
+0

Где я могу это поставить? – PMateus

0

Попробуйте создать представление списка ..

программно

использование

list = new ListView(getContext()); 

вместо

list = (ListView) v.findViewById(R.id.listView1); 

ИЛИ

редактировать свой XML, как

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:id="@+id/base_view"> 
    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 
</LinearLayout> 

(добавлен идентификатор для LinearLayout)

и в коде деятельности

LinearLayout base=v.findViewById(R.id.base_view); 

и установить этот вид, как содержание диалога

dialogOut.setContentView(base); 
Смежные вопросы