【问题标题】:listview getChildAt() Return nulllistview getChildAt() 返回 null
【发布时间】:2015-07-03 12:17:31
【问题描述】:

我一直在做一个 android 项目,但遇到了一个问题。我用谷歌搜索但没有找到答案。 在我的项目中,有一个名为viewsurahfragment 的片段,它包含一个id 为lv_showquran 的列表视图。

我想突出显示指定索引处的列表视图的视图。我正在使用 listview.getchildat() 但它返回 null 值。
这是viewurahfragment的代码。发出不相关的函数。

public class ViewSurahFragment extends Fragment
{
    private ListView listView;
    private int currentSurah;
    private String surahName;
    private DatabaseHelper databaseHelper;
    private ArrayAdapter<String> arrayAdapter;

    @Override
    public void onViewCreated(View view, Bundle savedInstanceState)
    {
        super.onViewCreated(view, savedInstanceState);
        //        this.listView = (ListView) getActivity().findViewById(R.id.lv_showQuran);
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        this.listView = (ListView) getActivity().findViewById(R.id.lv_showQuran);
    }

    private void displayAyas()
    {
        String[] values = this.getSurahAyas();
        this.listView.setItemsCanFocus(true);
        this.arrayAdapter = new ArrayAdapter<>(this.getActivity().getApplicationContext(), R.layout.layout_surah_ayah, values);

        this.listView.setAdapter(this.arrayAdapter);
        this.listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            {
            }
        });

        registerForContextMenu(this.listView);
    }

    public void highlightAyah(int ayahNum)
    {
        TextView view = (TextView) this.listView.getChildAt(ayahNum - 1);
        Log.i("ViewSurahFragment", "List View Child Counts Are: " + this.listView.getChildCount());

        if(view == null)
            Log.i("ViewSurahFragment", "view is null");
    }
}

不知道我是否在onactivitycreatedonviewcreated 中使用了以下代码行,它在highlightayah 函数中调用listview.getchildat() 时返回null。

this.listView = (ListView) getActivity().findViewById(R.id.lv_showQuran);

我也尝试过关注,但对我也不起作用。

ListView view = (ListView) getActivity().findViewById(R.id.lv_showQuran);
TextView v = (TextView) view.getChildAt(ayahNum);
Log.i("ViewSurahFragment", "List View Child Counts Are: " + view.getChildCount());

if(v == null)
    Log.i("ViewSurahFragment", "view is null");

但对我来说有趣的是 getchildviewcount() return 0 在我使用的任一解决方案中,但项目显示在列表视图中。
谁能告诉我我在哪里做错了。
提前感谢您的帮助。

【问题讨论】:

  • Capitalization 每个字都很难读...
  • 对不起,我有这样做的坏习惯。我希望有一天我能摆脱这个问题。我正在编辑我的帖子并尝试删除 capatilization。感谢您的指出。
  • 没问题,伙计,英语不是每个人的母语,事实上它也不是我的;)无论如何,感谢您的编辑!关于您的问题,您为什么要在 Activity 的布局中寻找 ListView ?你在哪里调用 public void highlightAyah(int ayahNum) ?您如何确保使用 =
  • 感谢您的耐心等待。无论如何,让我们言归正传。众所周知,一个 Fragment 由一个活动托管;因此,要访问它的任何视图,我们需要引用活动。正如我上面提到的,发出无关代码以仅显示对于此问题值得注意的代码。但是public void highlightAyah(int ayahNum) 由托管此片段的活动调用,并且它(活动)执行验证。
  • ayahNum 的值是多少?如果ayahNum 为0,我不会感到惊讶,并返回null,因为.getChildAt() 的输入实际上是-1(因为你减去输入的1)。

标签: android listview android-listview


【解决方案1】:

这会产生空值:

 TextView textView = (TextView) listView.getChildAt(0);
 Log.i("item", textView.getText().toString());

这不是:

    TextView textView = (TextView) listView.getAdapter().getView(0, null, listView);
    Log.i("item", textView.getText().toString());

此示例使用android.R.layout.simple_list_item_1,因此请记住 TextView 是 simple_list_item_1 中的根视图。

【讨论】:

  • 谢谢。这个有效。这是工作代码。 TextView view = (TextView) this.listView.getAdapter().getView(ayahNum - 1, null, this.listView); view.setBackgroundColor(Color.WHITE); Log.i("ViewSurahFragment", "列表视图子计数为:" + this.listView.getAdapter().getCount()); if(view == null) Log.i("ViewSurahFragment", "view is null");但现在我陷入了另一个问题。查看背景颜色不会变为白色。 :-(
  • 好吧,我现在唯一能建议的就是在适配器中定义选择。这样,您可以在 getView() 方法中将 textview 设置为具有白色背景(在那里您可以检查是否选择了项目)。
【解决方案2】:
private void highlightListView(int position)
{

    try
    {
        int i = 0;
        int count2 = alAudio.size();
        for (i = 0; i < count2; i++)
        {

            View view = lstvwSongs.getChildAt(i - lstvwSongs.getFirstVisiblePosition());
            ViewHolder viewHolder = (ViewHolder) lstvwSongs.getAdapter().getView(i, view, lstvwSongs).getTag();

                if (i == position)
                {
                    viewHolder.txtvwTitle.setTextColor(color_item_highlight);
                }
                else
                {
                    viewHolder.txtvwTitle.setTextColor(color_item_normal);
                }
        }           
    }
    catch (Exception e)
    {           
        e.printStackTrace();
    }
}

这是突出显示列表视图项的最简单方法。

希望对你有所帮助。

【讨论】:

    【解决方案3】:

    因此,当您致电 getChildCount() 时 - 您的 listView 为空。看起来您在使用 displayAyas() 方法将内容放入其中之前调用它。

    检查displayAyas() 在哪里被调用。由于显示了项目 - 我想它在活动的某个地方被调用。放在getChildCount()之前。

    【讨论】:

    • displayAyas() 总是在 highlightAyah 之前从活动中调用。如果你愿意,我可以在这里分享完整的代码。
    • @RedPrince007 尝试这种方法来获取视图:stackoverflow.com/a/24864536/2448244
    • 我得到了问题的解决方案。解决方案由@Julius 发布,我将其标记为答案。无论如何感谢Ydjeen的回复
    【解决方案4】:

    在适配器上使用 getView 方法,而不是在列表视图上使用 getChildAt

    listview.getAdapter().getView(i, null, null)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-02
      • 1970-01-01
      • 2017-01-16
      • 1970-01-01
      • 1970-01-01
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多