我有一个应用程序,其中有几个视图(不同类型的列表项)位于RecyclerView中。每个项目在从数据库获取数据后进行更新。在浏览RecyclerView中的项目时,我遇到了粘性滚动的问题。我确定这是由于数据库访问操作导致的,并尝试解决该问题。我参考了StackOverflow上的几个答案,并阅读了官方Android文章(使ListView滚动平滑)。如Android文章中建议的一样,我使用AsyncTask将所有数据库访问操作移至后台线程,但仍然没有好运。下面是我在
在上面的代码中,
onBindViewHolder
中编写的代码以更新其中一个项目。new AsyncTask<RecyclerView.ViewHolder, Void, TaskPhysicalActivity>(){
private RecyclerView.ViewHolder v;
PhysicalActivityItemHolder pAItemHolder;
DBHelper mDbHelper;
User mUser;
@Override
protected TaskPhysicalActivity doInBackground(RecyclerView.ViewHolder... params) {
pAItemHolder = (PhysicalActivityItemHolder)params[0];
Calendar cal = Calendar.getInstance();
Calendar today = Calendar.getInstance();
Calendar earlier = Calendar.getInstance();
earlier.add(Calendar.DATE, -6);
mDbHelper = DBHelper.getInstance(mContext);
mUser = User.getDefaultUser(mContext);
try {
List<PhysicalActivity> physicalActivities = mDbHelper.getPhysicalActivityInRange(mUser, cal, cal);
PhysicalActivityReport physicalActivityReport = new PhysicalActivityReport(earlier.getTime(), today.getTime());
physicalActivityReport.makeReport(mContext, mUser);
int userStepGoal = PhysicalActivity.getDailyStepsGoal(mContext);
return new TaskPhysicalActivity(userStepGoal, physicalActivityReport.getPhysicalActivityList(), physicalActivities,physicalActivityReport);
} catch (ParseException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(TaskPhysicalActivity taskPhysicalActivity) {
int stepsCount = 0;
Calendar cal = Calendar.getInstance();
TaskPhysicalActivity taskPhysicalActivityObject = taskPhysicalActivity;
List<PhysicalActivity> physicalActivities = taskPhysicalActivityObject.getPhysicalActivities();
List<PhysicalActivity> activityList = taskPhysicalActivityObject.getActivityList();
PhysicalActivityReport physicalActivityReport = taskPhysicalActivityObject.getPhysicalActivityReport();
pAItemHolder.tvActivityEmptyText.setVisibility(View.GONE);
if (physicalActivities.size() > 0) {
for (int i = 0; i < physicalActivities.size(); i++) {
stepsCount = stepsCount
+ physicalActivities.get(i).getValue();
}
final int finalStepsCount = stepsCount > 0 ? stepsCount : 0;
pAItemHolder.tvActivityValue.setText(String.valueOf(finalStepsCount));
pAItemHolder.tvActivityValueText.setText(mContext.getResources().getString(R.string.steps_unit));
pAItemHolder.tvActivityEmptyText.setText("");
pAItemHolder.vActivityCardEmptyView.setVisibility(View.GONE);
pAItemHolder.vActivityCardView.setVisibility(View.VISIBLE);
} else {
pAItemHolder.tvActivityValue.setText("--");
pAItemHolder.tvActivityValueText.setText(mContext.getResources().getString(R.string.steps_unit));
pAItemHolder.tvActivityEmptyText.setText("");
pAItemHolder.vActivityCardEmptyView.setVisibility(View.VISIBLE);
pAItemHolder.vActivityCardView.setVisibility(View.GONE);
}
pAItemHolder.tvActivityGoal.setText(String.format(mContext.getResources().getString(R.string.activity_goal_display_string),
taskPhysicalActivityObject.getUserStepsGoal(), mContext.getResources().getString(R.string.steps_unit), mContext.getResources().getString(R.string.per_day)));
pAItemHolder.vActivityGraph.setActivityValues(activityList);
if (physicalActivityReport.getPhysicalActivityAverage() > 0) {
pAItemHolder.tvPercentInRange.setText("Average steps " + physicalActivityReport.getPhysicalActivityAverage());
}
if (activityList.size() == 0) {
pAItemHolder.vActivityCardEmptyView.setVisibility(View.VISIBLE);
pAItemHolder.vActivityCardView.setVisibility(View.GONE);
} else {
pAItemHolder.vActivityCardEmptyView.setVisibility(View.GONE);
pAItemHolder.vActivityCardView.setVisibility(View.VISIBLE);
}
}
}.execute(holder);
在上面的代码中,
doInBackground
内的以下四行代码执行数据库访问操作:List<PhysicalActivity> physicalActivities = mDbHelper.getPhysicalActivityInRange(mUser, cal, cal);
PhysicalActivityReport physicalActivityReport = new PhysicalActivityReport(earlier.getTime(), today.getTime());
physicalActivityReport.makeReport(mContext, mUser);
int userStepGoal = PhysicalActivity.getDailyStepsGoal(mContext);
我使用这些操作的结果在 onPostExecute
方法中更新UI。
我使用 AsyncTask
的方式有什么问题吗?我有遗漏吗?