0

このコードはオンラインのチュートリアルで見つけたので、少し奇妙であれば申し訳ありませんが、動作することがわかった唯一のコードです。

ListView各行には aとCheckBoxaがありTextViewます。ページ上のボタンをクリックすると、チェックボックスがオンになっている行の名前が のTextView上に別の場所に表示されますListView

少なくとも 1 つの行がチェックされている限り、これはすべて正常に機能します。4つのチェックボックスをオンにしてボタンを押すと、4つの名前がす​​べて表示され、2つのチェックボックスをオフにすると、残りの2つの名前だけが表示されます.

ただし、私の問題は、チェックボックスがチェックされていない場合TextView、最後CheckBoxにチェックされていない名前が表示されることです(アプリを起動してから少なくとも1つがチェックされていると仮定します)。

これはなぜですか。また、チェックボックスがチェックされていないときに何も表示されないようにするにはどうすればよいですか?

onCreate で呼び出されるアダプターとメソッドを次に示します。

private class MyCustomAdapter extends ArrayAdapter<Country> {

        private ArrayList<Country> countryList;

        public MyCustomAdapter(Context context, int textViewResourceId,
                ArrayList<Country> countryList) {
            super(context, textViewResourceId, countryList);
            this.countryList = new ArrayList<Country>();
            this.countryList.addAll(countryList);
        }

        private class ViewHolder {
            TextView item;
            CheckBox favourite;
        }

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {

            ViewHolder holder = null;
            Log.v("ConvertView", String.valueOf(position));

            if (convertView == null) {
                LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                convertView = vi.inflate(R.layout.country_info, null);

                holder = new ViewHolder();
                holder.item = ((TextView)convertView.findViewById(R.id.infoBox));
                holder.favourite = ((CheckBox)convertView.findViewById(R.id.checkBox1));
                convertView.setTag(holder);

                holder.favourite.setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        CheckBox cb = (CheckBox) v;
                        Country country = (Country) cb.getTag();
                        country.setSelected(cb.isChecked());
                    }
                });

            } else {
                holder = (ViewHolder) convertView.getTag();
            }

            Country country = countryList.get(position);
            holder.item.setText(country.getName());
            holder.favourite.setChecked(country.isSelected());
            holder.favourite.setTag(country);

            return convertView;

        }

    }

    private void checkButtonClick() {


  Button myButton = (Button) findViewById(R.id.findSelected);
  myButton.setOnClickListener(new OnClickListener() {

   @Override
   public void onClick(View v) {

       String stringName = "";

    ArrayList<Country> countryList = dataAdapter.countryList;
    for(int i=0;i<countryList.size();i++){
      Country country = countryList.get(i);
     if(country.isSelected()){
     stringName = (stringName + country.getName());

     TextView t = ((TextView)findViewById(R.id.textView1));
     t.setText(stringName);

     }

   }
   }
  });

コンパイルまたは実行時にエラーが表示されないため、残念ながら logCat を投稿できません。

助けてくれてありがとう

4

3 に答える 3

0
@Override
public void onClick(View v) {

    String stringName = "";

    ArrayList<Country> countryList = dataAdapter.countryList;

    for(int i=0;i<countryList.size();i++){
        Country country = countryList.get(i);
        if(country.isSelected()){
            stringName = (stringName + country.getName());

            // ---------The problem is here: 
            // This code is unreachable when none of the checkboxes is checked               

            TextView t = ((TextView)findViewById(R.id.textView1));
            t.setText(stringName);
        }
    }
}

checkboxesのいずれもチェックされていない場合を考えてみましょう。ロジックにより、if (country.isSelected())が返されfalseます。そのため、 内のコードはif-block一度も実行されません。また、TextView の値は以前と同じままです。

解決策: for ループが完了するまで、テキストの検出と設定を TextView に移動します。

ここで、どのifステートメントも評価されない場合true(つまり、どれもcheckboxesチェックされない場合)、 variablestringNameは の値を保持します"" (empty String)。これはまさに本来あるべき値です。

于 2013-08-31T16:46:59.527 に答える
0

ListView の CheckBoxes に関する問題を回避するには、最初に false で初期化されたブール配列を取得し、ListView でチェックボックスがオンになっている配列内の対応する位置を true にします。これにより、アプリケーションで前後に移動するときにチェックボックスのチェック状態で問題が発生することはありません。

于 2013-08-31T04:05:22.767 に答える
0

ここで、checkboxstate はブール配列です。

holder.checkbox.setOnClickListener(new View.OnClickListener() {

                public void onClick(View v) {
                    if (((CheckBox) v).isChecked())
                        checkBoxState[pos] = true;
                    else
                        checkBoxState[pos] = false;

                }
            });
于 2013-08-31T09:27:19.073 に答える