onBindViewHolder和RecyclerView如何工作?

时间:2019-04-26 08:39:43

标签: android android-recyclerview

我阅读了When onBindViewHolder is called and how it works?帖子和官方文档,但没有找到问题的答案。 每次需要绑定数据时都会调用onBindViewHolder,我在日志中放置了一个变量,该变量每次被调用时都递增,并且必须绑定到该单词:

await

这是日志:

        List<UserViewModel> _ListUser = new List<UserViewModel>();
    public XmlElement CreateUpdateUser(Stream input)
    {
        Main(_ListUser, HttpContext.Current); // using await here makes performance slower and without await it's faster but it returns to the next statement immediately thats the problem.
        return FormatResponse("S", "Record(s) created successfully.");
    }
    public async Task Main(List<UserViewModel> _ListUser, HttpContext current)
    {
        try
        {
            WriteToLog("Import Users - Start", 0, DateTime.Now);
            UserViewModel _objSiteFileUserSettings = await FillupSiteFileSettings(new UserViewModel());
            List<Branch> _branchCollection = await db.Branches.ToListAsync();
            List<UserType> _usertypeCollection = await db.UserTypes.ToListAsync();
            List<UserStatu> _userstatusCollection = await db.UserStatus.ToListAsync();
            List<UserDept> _userdeptCollection = await db.UserDepts.ToListAsync();
            List<UserLocation> _userlocationCollection = await db.UserLocations.ToListAsync();
            HttpContext.Current = current;
            //var tasks = new List<Task>();
            foreach (var x in _ListUser)
                Update1Record(x, _objSiteFileUserSettings, _branchCollection, _usertypeCollection, _userstatusCollection, _userdeptCollection, _userlocationCollection);
            WriteToLog("Import Users - End", 0, DateTime.Now);
        }
        catch (Exception ex)
        {
            throw new Exception(ex.ToString());
        }

    }

    public string Update1Record(UserViewModel objUser, UserViewModel _objSiteFileUserSettings, List<Branch> _Lbranch, List<UserType> _Lusertype, List<UserStatu> _Luserstatus, List<UserDept> _Luserdept, List<UserLocation> _Luserlocation)
    {
        objUser.BranchSiteFile = _objSiteFileUserSettings.BranchSiteFile;
        objUser.UsrTypeSiteFile = _objSiteFileUserSettings.UsrTypeSiteFile;
        objUser.UsrStatSiteFile = _objSiteFileUserSettings.UsrStatSiteFile;
        objUser.BranchId = objUser.Branch != null ? CheckBranch(objUser.Branch, _Lbranch) : null;
        objUser.UserDeptId = objUser.UserDept != null ? CheckDept(objUser.UserDept, _Luserdept) : null;
        objUser.UserLocationId = objUser.UserLocation != null ? CheckLocation(objUser.UserLocation, _Luserlocation) : null;
        objUser.UserStatusId = objUser.UserStatus != null ? CheckStatus(objUser.UserStatus, _Luserstatus) : null;
        objUser.UserTypeId = objUser.UserType != null ? CheckType(objUser.UserType, _Lusertype) : 0;
        objUser._iEmail = _objSiteFileUserSettings._iEmail;
        objUser._iSMS = _objSiteFileUserSettings._iSMS;

        using (var VibrantDbContext = new VIBRANT())
        using (var AuditDb = new VibrantAuditEntities())
        using (var VibrantTransaction = VibrantDbContext.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
        using (var AuditTransaction = AuditDb.Database.BeginTransaction(System.Data.IsolationLevel.ReadCommitted))
        {
            try
            {
                VibrantDbContext.Configuration.AutoDetectChangesEnabled = false;
                objUser.RecordTimeStamp = DateTime.Now;
                var _ObjUserItem = FillupDateTimeValues(objUser);
                ImportToDB(_ObjUserItem, 0, VibrantDbContext, AuditDb);
                BuildImportLog(objUser, VibrantDbContext, AuditDb);
                VibrantDbContext.SaveChanges();
                AuditDb.SaveChanges();
                VibrantTransaction.Commit();
                AuditTransaction.Commit();
            }
            catch (Exception ex)
            {
                VibrantTransaction.Rollback();
                AuditTransaction.Rollback();
                throw new Exception(ex.ToString());
            }
        }
        return "S";
    }
    public XmlElement FormatResponse(string Status, string Message)
    {
        XmlDocument xmlDoc = new XmlDocument();
        XmlNode response = xmlDoc.CreateElement("Response");
        xmlDoc.AppendChild(response);
        XmlNode statusNode = xmlDoc.CreateElement("Status");
        statusNode.InnerText = Status;
        response.AppendChild(statusNode);
        XmlNode MessageNode = xmlDoc.CreateElement("Message");
        MessageNode.InnerText = Message;
        response.AppendChild(MessageNode);
        return xmlDoc.DocumentElement;
    }

onBindViewHolder由RecyclerView调用,因此无论何时必须绑定,都将调用它。 RecyclerView如何知道何时不应该再调用OnBindViewHolder,因为没有更多数据要绑定到它?在我的代码中,我没有发现可归因于此行为的任何内容。在代码中,只有数据库查询和wordItemView setText。

2 个答案:

答案 0 :(得分:1)

每次需要填写一个条目时,都会调用

onBindViewHolder()。例如,如果您的数据大小为10,则在滚动列表时,该方法将被调用10次。如果再次向上滚动,则RecyclerView将多次调用该方法来更新视图数据。

重要的是,您需要管理将要放置在每个位置的数据。在您的示例中,x仅递增,因此每次调用onBindViewHolder()方法时都会有不同的数据。

列表的大小由getItemCount()方法确定。

希望有帮助。

答案 1 :(得分:0)

Recyclerview与listview相似,一个重要的区别是reyclerview将仅加载当前在屏幕上可见的项目,从而在加载列表中的大量数据时具有非常好的时间和空间复杂性。