0

チェックボックスが表示されたリストビューがあります。各ボックスのテキストは。で設定されますListAdapter。すべてが読み込まれたら、デフォルトでいくつかのチェックボックスをオンにし、いくつかのチェックボックスをオフにする必要があります。setCheckedチェックボックスを呼び出すことはできますが、機能しません。これはonCreate()、ビューにまだ表示されていないためだと思います。だから私はそれをに移動しましたonResume()onCreate()そして今のところそれはまだ機能しません。それらはまだロードされておらず、画面に表示されていないようです。

private void markAllTags()//this will put a check mark on the ones that are already a tag of that question
{
    String tags[] = mUserDb.fetchTagById(mQid);//These are the tags that are already associated with this question
    for(int i = 0; i < this.getListAdapter().getCount(); i++)
    {
        View v = this.getListAdapter().getView(i, null, null);
        //Log.w("NME", "I = " + this.getListAdapter().getView(i, null, null).findViewById(R.id.checkBox1));
        if(v != null)
        {
            CheckBox cb = (CheckBox)v.findViewById(R.id.checkBox1);
            String cbTags = "" + cb.getText();
            for(int j = 0; j < tags.length; j++)
            {
                //Log.w("NME", "cbTag = " + cbTags + " tags[j] = " + tags[j]);
                if(cbTags.equals(tags[j]))
                {
                    cb.setChecked(true);
                }
            }
        }

    }
}

これは現在onStartから呼び出されています。

使用するlistview.getchildAt()と、null値を受け取ります。

編集:クラッシュはないので、logcatには実際には何も表示されません。したがって、問題は、最後のifステートメントが満たされたときに、チェック済みとしてマークされないことです。

編集2:それで私はさらにいくつかのことを試みました。上記の機能をボタンにリンクしましたが、それでも機能しませんでした。設定されている行を変更したときView v。これView v = mListView.getChildAt(i);にボタンを押すと動作しました。ただし、アクティビティの開始時にはまだ機能しません。問題は、vがnullであるということです。

4

3 に答える 3

1

以下のようにコードにelseパーツを追加することで、この問題を回避できます。

if(cbTags.equals(tags[j]))
{
cb.setChecked(true);
}else{
cb.setChecked(false);
}

:)

于 2013-01-17T05:12:38.370 に答える
0

これは、通常ListViewを使用する方法ではありません。通常は、onCreateでアダプターを設定し、値の初期リストを設定するだけです。次に、Adapter.getViewで、チェックボックスの値をビューの値に設定します。このようにadapter.getViewを呼び出すことは悪い考えです。この関数は、現在画面に表示されているビューを作成および初期化するためにリストビューによって使用されるため、問題が発生する可能性があります。

于 2013-01-17T05:19:04.620 に答える
0

私は自分の問題の解決策を見つけました。もっと良い方法があるかもしれません。もしあればそれを聞きたいです。私はこれに対する答えで見つけたものを使用しました 。私がmarkAllTags()内部に電話をするとき、私onStart()はそれをこれで囲みました。

    final Handler handler = new Handler();
    handler.postDelayed(new Runnable() {
      public void run() {
          markAllTags();
      }
    }, 100);

また、私のmarkAllTags()関数は次のようになります。

private void markAllTags()//this will put a check mark on the ones that are already a tag of that question
{
    String tags[] = mUserDb.fetchTagById(mQid);//These are the tags that are already associated with this question
    for(int i = 0; i < this.getListAdapter().getCount(); i++)
    {
        View v = mListView.getChildAt(i);
        //View v = this.getListAdapter().getView(i, null, null);
        //Log.w("NME", "I = " + this.getListAdapter().getView(i, null, null).findViewById(R.id.checkBox1));
        Log.w("NME", "checking to see if V != null");
        if(v != null)
        {
            Log.w("NME", "V != null");
            CheckBox cb = (CheckBox)v.findViewById(R.id.checkBox1);
            String cbTags = "" + cb.getText();
            for(int j = 0; j < tags.length; j++)
            {
                //Log.w("NME", "cbTag = " + cbTags + " tags[j] = " + tags[j]);
                if(cbTags.equals(tags[j]))
                {
                    cb.setChecked(true);
                }
            }//end for
        }//end if null

    }//end for
}//end

前回の編集で述べたように、設定した場所を変更しましたが、View vそれ以外はほぼ同じである必要があります。

于 2013-01-18T01:01:29.170 に答える