【问题标题】:Recyclerview findViewHolderForAdapterPosition returns null after scroll to new position滚动到新位置后,Recyclerview findViewHolderForAdapterPosition 返回 null
【发布时间】:2015-08-13 12:56:32
【问题描述】:
RecyclerView recyclerView;
MyAdapter mAdapter;
List<ItemData> itemsData;
Global glb;
LinearLayoutManager llm;

private int valData() {
    String tmpStr;
    Cursor c;
    int position=0;
enter code here
    AutoCompleteTextView tTbl = (AutoCompleteTextView) findViewById(R.id.tblNam);
    tmpStr = tTbl.getText().toString();
    c = db.rawQuery("SELECT * FROM tblDts WHERE tblNam = '" + tmpStr + "'", null);
    if (c.getCount() == 0) {
        showMessage("Error", "Table Name Not Found");
        c.close();
        tTbl.requestFocus();
        return 1;
    }
    c.close();

    for (int i = 0; i < itemsData.size(); i++) {
        tmpStr = itemsData.get(i).getTitle().toString();
        c = db.rawQuery("SELECT * FROM itmDts WHERE itmNam = '" + tmpStr + "';", null);
        if (c.getCount() == 0) {

            c.close();

            //llm.scrollToPositionWithOffset(i,0);
            //recyclerView.smoothScrollToPosition(i);
            //recyclerView.scrollToPosition(i);

我尝试了上述所有滚动过程,当我使用 getChildAt 时,它只返回前滚动而不是新滚动的视图

            //View vw = llm.getChildAt(0);
            tmpStr="";

当在当前显示视图之间上升 findviewholderforadapterpostion 时,它已正确显示,但如果我上升非显示位置,则返回 null RecyclerView.ViewHolder vh = recyclerView.findViewHolderForAdapterPosition(i); 查看 vw = vh.itemView;

            AutoCompleteTextView tTa=(AutoCompleteTextView)vw.findViewById(R.id.item_title);
            tmpStr =tTa.getText().toString();


            showMessage(llm.getChildCount()+"Error" + position, "Item Name Not Found" + tmpStr);

            //recyclerView.setLayoutManager(lm);


            return 1;
        }
        c.close();

    }
    return 0;
}


   }
}

【问题讨论】:

标签: android-recyclerview


【解决方案1】:

我在 Android 平台上总是面临这些问题。我的大部分问题都通过线程睡眠解决了:)这不是正确的方法,但找不到任何其他方法。只需在滚动下一项后添加 100 毫秒睡眠即可。

以下代码适用于 Xamarin.Android。

public async static void FocusNextItem(Android.Support.V7.Widget.RecyclerView recyclerView, int nextPosition)
    {
        recyclerView.ScrollToPosition(nextPosition);

        var viewHolder = recyclerView.FindViewHolderForAdapterPosition(nextPosition);
        if (viewHolder == null)
        {
            await System.Threading.Tasks.Task.Delay(100);

            viewHolder = recyclerView.FindViewHolderForAdapterPosition(nextPosition);
        }
        viewHolder?.ItemView?.RequestFocus();
    }

【讨论】:

  • 是的,Saret,你是​​对的,但我找不到正确的方法来处理这类问题。
  • 我面临着完全相同的问题,我也决定使用线程睡眠。我也知道它看起来不是一个好的解决方案,但似乎没有任何回调可以用于此目的。您是否设法想到了其他解决方案?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多