2017-01-30 11 views
2

私は線形レイアウトを持ち、可変数のリスト項目を動的に追加したい。 (これはリサイクラービューではありません。このリストは既にリサイクラービューにあり、小さなリストであるとみなされます)。しかし、何らかの理由で、最後の項目を除いて設定したテキストは保存されません。別のタイトルのアイテムを追加した場合、最後に追加されたアイテムが表示され、他のアイテムは「デフォルト」と表示されます。誰が何が起こっているか知っていますか?それは本当に奇妙です。ありがとう!ここLinearLayoutにプログラムで1つ以外のテキストを設定しないで表示する

コードである:

settings_item.xml

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

    <TextView 
     style="?android:listSeparatorTextViewStyle" 
     android:id="@+id/title" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:background="#00000000" 
     android:text="Default" 
     android:layout_weight="1"/> 

    <CheckBox 
     android:id="@+id/checkbox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="end|center_vertical" 
     android:layout_weight="0"/> 

</LinearLayout> 

root_settings_view.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" 
    android:layout_marginEnd="5dp"> 
</LinearLayout> 

SettingsView.java:

public class SettingsView extends LinearLayout { 

    //Views 
    private View view; 

    /** 
    * Constructor for android tools to use. 
    */ 
    public SettingsView(Context context) { 
     super(context); 
    } 

    /** 
    * 
    * @param parent 
    */ 
    public SettingsView(ViewGroup parent) { 
     super(parent.getContext()); 

     //Get the inflated layout 
     LinearLayout view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.root_settings_view, parent, false); 


     View itemView = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
     ((TextView) itemView.findViewById(R.id.title)).setText("Hi"); 
     ((CheckBox) itemView.findViewById(R.id.checkbox)).setChecked(true); 


     View itemView2 = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
     ((TextView) itemView2.findViewById(R.id.title)).setText("Hello"); 
     ((CheckBox) itemView2.findViewById(R.id.checkbox)).setChecked(false); 

     View itemView3 = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
     ((TextView) itemView3.findViewById(R.id.title)).setText("Bye"); 
     ((CheckBox) itemView3.findViewById(R.id.checkbox)).setChecked(true); 

     View itemView4 = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
     ((TextView) itemView4.findViewById(R.id.title)).setText("Test"); 
     ((CheckBox) itemView4.findViewById(R.id.checkbox)).setChecked(false); 

     addView(view); 
    } 

Result

+1

/** * A item view with the title and a checkbox. */ public class SettingItemView extends LinearLayout { private TextView mTitle; private CheckBox mCheckBox; public SettingItemView(Context context) { super(context); inflate(context, R.layout.settings_item, this); mTitle = (TextView) findViewById(R.id.title); mCheckBox = (CheckBox) findViewById(R.id.checkbox); } public void setTitle(String title) { mTitle.setText(title); } public void setCheckbox(boolean checked) { mCheckBox.setChecked(checked); } } 

は、このコンストラクタメソッドを変更しますあなたが望むものを膨らませるのではなく、それを膨らませるのではなく、リストアイテムを親の 'view'に' addView'する必要があります –

答えて

1

私はこのためのウィジェットをしなければならないことを私に確信させたあなたのコメント、のためにあなたを@Rod_Algonquinありがとうございます。幸いにも前にウィジェットをやったので、どうやってやるのか分かっていました。私はちょうどそれを避けようとしていましたが、私たちがウィジェットを使用しないと、重複するIDに問題があると思います。

次のコードは、それがうまく行わ:

追加新しいクラス、SettingItemView.java:あなたがいるときは、同じIDを持つカント

/** 
* 
* @param parent 
*/ 
public SettingsView(ViewGroup parent) { 
     super(parent.getContext()); 

     //Get the inflated layout. 
     LinearLayout view = LayoutInflater.from(getContext()).inflate(R.layout.root_settings_view, parent, false); 


     SettingItemView itemView = new SettingItemView(parent.getContext()); 
     itemView.setTitle("Hi"); 
     itemView.setCheckbox(true); 
     view.addView(itemView); 

     SettingItemView itemView2 = new SettingItemView(parent.getContext()); 
     itemView2.setTitle("Hello"); 
     itemView2.setCheckbox(true); 
     view.addView(itemView2); 

     SettingItemView itemView3 = new SettingItemView(parent.getContext()); 
     itemView3.setTitle("Bye"); 
     itemView3.setCheckbox(true); 
     view.addView(itemView3); 

     addView(view); 
    } 
1

あなたは基本的に、その上で実行し、最後のものだけを追加している、このコードは動作するはずです:

公共SettingsView(のViewGroup親){ スーパー(parent.getContext());

//Get the inflated layout 
    LinearLayout view = (LinearLayout) LayoutInflater.from(getContext()).inflate(R.layout.root_settings_view, parent, false); 


    View itemView = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
    ((TextView) itemView.findViewById(R.id.title)).setText("Hi"); 
    ((CheckBox) itemView.findViewById(R.id.checkbox)).setChecked(true); 
    addView(view); 
    View itemView2 = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
    ((TextView) itemView2.findViewById(R.id.title)).setText("Hello"); 
    ((CheckBox) itemView2.findViewById(R.id.checkbox)).setChecked(false); 
    addView(view); 
    View itemView3 = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
    ((TextView) itemView3.findViewById(R.id.title)).setText("Bye"); 
    ((CheckBox) itemView3.findViewById(R.id.checkbox)).setChecked(true); 
    addView(view); 
    View itemView4 = LinearLayout.inflate(parent.getContext(), R.layout.settings_item, view); 
    ((TextView) itemView4.findViewById(R.id.title)).setText("Test"); 
    ((CheckBox) itemView4.findViewById(R.id.checkbox)).setChecked(false); 

    addView(view); 
+0

これはLogCatで無限の再帰を与えましたこの行は繰り返し表示されます: 'android.view.View.Viewet.ResolvedLayoutDirection(ViewGroup.java:6713)' –

+0

私は 'addView(itemView)'などを除いて同じことを考えました。しかし、何も表示されない理由は説明しません私はそれを見ると 'ViewGroup'に' root_settings_view'だけが追加されています。 – Micha

+0

yanivtwinは自分のコードを誤解していると思います。なぜなら、私は実際にルートビュー(私が4つのアイテムビューを膨らませた場所)を親LinearLayoutに追加しています。彼らはインフレ法によってのみ追加された。手動で項目を追加しようとすると、再帰問題が発生しました。 –

関連する問題