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()我会收到一个空值。

编辑:没有崩溃,所以 logcat 中没有真正出现。所以问题是,当满足最终的 if 语句时,它不会将其标记为已检查。

编辑2:所以我尝试了更多的东西。我将上面的功能链接到一个按钮,但它仍然不起作用。当我更改View v设置的行时。为此View v = mListView.getChildAt(i);,当我按下按钮时它起作用了。但是,当活动开始时它仍然不起作用。现在的问题是 v 为空。

4

3 回答 3

1

您可以通过在代码中添加 else 部分来避免此问题,如下所示

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

:)

于 2013-01-17T05:12:38.370 回答
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 回答
0

这不是您通常使用 ListView 的方式。通常,您只需在 onCreate 中设置适配器,以及初始值列表。然后在 Adapter.getView 中,您可以将复选框的值设置为视图应有的值。像这样调用 adapter.getView 是个坏主意——列表视图使用该函数来创建和初始化当前屏幕上的视图,这可能会导致问题。

于 2013-01-17T05:19:04.620 回答