在Android ListView中,我如何迭代/操纵所有子视图,而不仅仅是可见视图?

Cor*_*ger 10 android android-widget

下面的代码不会更改所有ListView's行的文本,因为getChildCount()它不会获取所有ListView's行,而只会获取可见的行.

for (int i = 0; i < listView.getChildCount(); i++)
{
    View v = listView.getChildAt(i);
    TextView tx = (TextView) v.findViewById(R.id.mytext);
    tx.setTextSize(newTextSize);
}
Run Code Online (Sandbox Code Playgroud)

所以我该怎么做?

ListView's行变得可见时是否有用于获取通知的代码,因此我可以设置其文本大小?

Rom*_*Guy 15

在ListView中,唯一的子项是可见的子项.如果你想对"所有孩子"做点什么,可以在适配器中做.那是最好的地方.


Ric*_*red 9

API Demos中的List13使用OnScrollStateChanged执行类似的操作.但是,可能有更好的方法:

public void onScrollStateChanged(AbsListView view, int scrollState) {
    switch (scrollState) {
    case OnScrollListener.SCROLL_STATE_IDLE:
        mBusy = false;

        int first = view.getFirstVisiblePosition();
        int count = view.getChildCount();
        for (int i=0; i<count; i++) {
            TextView t = (TextView)view.getChildAt(i);
            if (t.getTag() != null) {
                t.setText(mStrings[first + i]);
                t.setTag(null);
            }
        }

        mStatus.setText("Idle");
        break;
Run Code Online (Sandbox Code Playgroud)

...

由Corey Trager编辑:

以上肯定指出了我正确的方向.我发现处理OnScrollListener.onScroll比onScrollStateChanged工作得更好.即使我在onScrollSgtaetChanged中删除了case语句并处理了每个状态更改,一些文本也没有调整大小.但是使用onScroll,事情似乎有效.

所以,我看似工作的代码看起来像这样:

public void onScroll(AbsListView v, int firstVisibleItem, int visibleCount, int totalItemCount)
{
    ListView lv = this.getListView();
    int childCount = lv.getChildCount();

    for (int i = 0; i < childCount; i++)
    {
        View v = lv.getChildAt(i);
        TextView tx = (TextView) v.findViewById(R.id.mytext);
        tx.setTextSize(textSize);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这可能会起作用,但也会非常昂贵.您正在对每个滚动事件执行相同的工作,您可以从中接收许多滚动事件(并且不一定仅在新项目可见时). (2认同)
  • 不,他们不是.我们正在处理手机和*所有*你需要花费*电池*.绝对没有理由成为懒惰的程序员和浪费电池.Android可以在手机上使用的原因是因为我们花了很多时间来担心性能和电池续航时间.我们还有很多工作要做,但你的观点肯定是有缺陷的.在某些情况下,不需要担心性能(例如按钮点击),但是为滚动的每个像素做的事情只是愚蠢的. (2认同)