2017-05-04 11 views
0

LinearLayoutには、さまざまな数のチェックボックスがあります。私が1ヶ月前に持っていた質問では、誰かがチェックボックスを動的に表示するのではなく、動的に追加する方が良いと言った人がいました。LinearLayoutのチェックボックスのベストソリューション

Integer[] count = new Integer[]{1,2,3,4,5,6,7,8,9,10}; 
size = mFrageList.get(position).getAuswahlList().size(); 
for (int i = 0; i < size; i++) { 

    cBox = new CheckBox(this); 
    cBox.setText(mFrageList.get(position).getAuswahlList().get(i)); 
    cBox.setId(count[i]); 
    cBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     Override 
     public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

      if(isChecked){ 
       antwortencode[position] += "" + buttonView.getId(); 
       frageBeantworten.setText("Antwort :"+antwortencode[position]+" abgeben"); 

      } else { 
       String id = Integer.toString(buttonView.getId()); 
       antwortencode[position] = antwortencode[position].replaceAll(id,""); 
       if(!antwortencode[position].isEmpty() || antwortencode[position]!= "") { 
        frageBeantworten.setText("Antwort :" + antwortencode[position] + " abgeben"); 
        } else { 
         frageBeantworten.setText("Keine Checkbox(en) gewählt"); 
        } 
      } 
     } 
}); 

antworten.addView(cBox); 

現在、私はそれはそれは、文字列のうち、値の削除、Iチェックボックスをオフには、チェックすると、確認のチェックボックスに文字列を保存することができますよ。 アクティビティを更新すると、文字列が保存され、チェックボックスはmFrageList.get(position)から新しいListを取得します。getAuswahlList(); "antwortencode"リストに新しい文字列を値で埋めてください。

最後の位置に戻ると、生成された文字列がありますが、チェックボックスはもうチェックされません。しかし、彼らは古い位置から文字列を持っています。つまり、チェックボックスの状態以外はすべて保存されます。私は、cBox.setChecked(isChecked)またはbuttonView.setChecked(isChecked)またはbuttonView.setChecked(buttonView.isChecked())、あるいはほぼ同じ構文を設定することはできません。

xmlファイルの10個のチェックボックスを1つずつ宣言し、auswahlList.get(position).isEmpty()が設定されている場合は、VISIBLE.falseを設定する以外に何ができるのですか。

重要:コンテンツのサイズが画面を過度に超えたため、私のXMLはスクロール可能アクティビティです。それで私はなぜリストビューを使用できなかったのですか?ですから、私はLinearLayoutを使用するソリューションが必要です

答えて

0

I'veだけでは私の問題を解決するために管理し、今私はそれがプログラミングの最良の例をisn't場合でも、それを共有したいと思います。

Integer[] count = new Integer[]{1,2,3,4,5,6,7,8,9,10}; //maximum of 10 Checkboxes 
     size = mFrageList.get(position).getAuswahlList().size(); 
     for (int i = 0; i < size; i++) { 
      cBox = new CheckBox(this); 
      cBox.setText(mFrageList.get(position).getAuswahlList().get(i)); 
      cBox.setId(count[i]); 

      try{ //this is where the magic happens 
       if(antwortencode[position] != ""){ //cause i won´t want null in my db i´ve set "" as standard string in my activity for the List<String> 
        String code = antwortencode[position]; 
        char[] c = code.toCharArray(); 
        for(int j=0;j<=c.length;j++){ 
         int x = c[j] -'0'; // 'char 1' - 'char 0' = Integer 1 , lol 
         if(cBox.getId()== x){ //compare them 
          cBox.toggle(); //if it fits, toggle 
         } 
        } 
       } 
      } catch (Exception e){ 
        e.printStackTrace(); 
      } //and here it ends 

      cBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 

        if(isChecked){ 
         antwortencode[position] += "" + buttonView.getId(); 
         frageBeantworten.setText("Antwort :"+antwortencode[position]+" abgeben"); 

        } else { 
         String id = Integer.toString(buttonView.getId()); 
         antwortencode[position] = antwortencode[position].replaceAll(id,""); 
         if(!antwortencode[position].isEmpty() || antwortencode[position]!= "") { 
          frageBeantworten.setText("Antwort :" + antwortencode[position] + " abgeben"); 
         } else { 
          frageBeantworten.setText("Keine Checkbox(en) gewählt"); 
         } 
        } 
       } 
      }); 

      antworten.addView(cBox); 

私の質問の回答と修正のためのTy。 Nostramarus

0

実際にはListViewを使用する必要があります。あなたがレイアウトを何度も再利用する限り、それをやりなさい。

は、2つのオプションがあります:rootとして

  • のListView - スクロール可能なレイアウト内部

  • リストビューは、ビューのさまざまな種類とレイアウトの他のコンテンツを追加する - リストビューの多くの軽量な実装があることそれがコンテンツをラップできるようにする、例えばhttps://github.com/paolorotolo/ExpandableHeightListView

もう1つの方法は、チェックボックスの使用 - モデルクラスの使用方法です。リストビューでは、すべての位置を反復処理するメソッドを提供するAdapterを使用することが非常に簡単です。アダプタの

例:

public class CheckableItemAdapter extends BaseAdapter { 

private List<Pair<Integer, Boolean>> items = new ArrayList<>(); 

public void setItems(List<Pair<Integer, Boolean>> items) { 
    this.items = items; 
} 

@Override 
public int getCount() { 
    return items.size(); 
} 

@Override 
public Object getItem(int position) { 
    return items.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view; 
    ViewHolder holder; 
    if (convertView == null) { 
     view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_checkable, parent, false); 
     holder = new ViewHolder(view); 
     view.setTag(holder); 
    } else { 
     view = convertView; 
     holder = (ViewHolder) view.getTag(); 
    } 
    Pair<Integer, Boolean> item = items.get(position); 
    holder.itemCheck.setChecked(item.second); 
    return view; 
} 

static class ViewHolder { 

    CheckBox itemCheck; 

    public ViewHolder(View itemView) { 
     itemCheck = (CheckBox) itemView.findViewById(R.id.check); 
    } 
} 
} 
+0

いいえ、私はScrollableActivityを妨害して逆にするListviewの原因を使用できません。そして、1つのアクティビティで両方を使用することは不可能です(?)。限り、私はこの問題についてのstackoverflowのトピックを読んでいる限り。しかし、私はそれだけで自分の問題を解決しました。プログラミングの8時間後に私の頭と指がぬるぬるし始めます。 –

関連する問題