好吧,我之前写过这个问题,但从那时起就把问题缩小了,所以决定改写它。我想要做的是在ExpandableListView中的每个组中设置倒数计时器。现在我通过在模型对象中开始每个倒计时来做到这一点,然后当我给每个组充气时,我得到该项目的剩余时间并将其传递给适配器中倒数计时器的新实例。这一切都很有效,除非我扩展子列表并将远离屏幕的一些父组滚动到它们被回收的位置。重新创建它们时,除了包含倒计时的文本视图之外,所有视图都已正确设置,此视图会切换。所以我看到的是两个或更多的错误倒计时组。这些组仍处于有序状态,模型对象仍然是正确的。所以我的具体问题是两个:1。有没有更好的方法来实现我想要实现的目标? 2.这可能会发生,因为我正在访问设置内部类倒计时的textview吗?我原本以为这个问题与可扩展列表有关,返回错误的viewGroup,现在我不太确定。
@Override
public View getGroupView(int groupPosition, final boolean isExpanded, View convertView, final ViewGroup parent) {
final GroupViewHolder groupViewHolder;
if (convertView == null) {
LayoutInflater infalInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = infalInflater.inflate(R.layout.item_lobby, null);
groupViewHolder = new GroupViewHolder();
convertView.setTag(groupViewHolder);
}else{
groupViewHolder = (GroupViewHolder) convertView.getTag();
}
groupViewHolder.lobbyItemExpandIndicator = (ImageView) convertView.findViewById(R.id.lobbyItemExpandIndicator);
groupViewHolder.gameType = (TextView) convertView.findViewById(R.id.lobbyGameType);
groupViewHolder.accepting = (TextView) convertView.findViewById(R.id.lobbyAccepting);
groupViewHolder.gamesInDraft = (TextView) convertView.findViewById(R.id.lobbyGamesInDraft);
groupViewHolder.mContestItem = (ContestItem) getGroup(groupPosition);
groupViewHolder.draftCloses = groupViewHolder.mContestItem.getDraftCloses();
if (groupViewHolder.draftCountdownTimer == null) {
groupViewHolder.draftEnding = (TextView) convertView.findViewById(R.id.lobbyDraftEnding);
groupViewHolder.draftCountdownTimer = new CountDownTimer(groupViewHolder.draftCloses, 1000) {
@Override
public void onTick(long millisUntilFinished) {
long durationSeconds = millisUntilFinished / 1000;
groupViewHolder.draftEnding.setText((String.format(Locale.ENGLISH, "%02d:%02d:%02d", durationSeconds / 3600,
(durationSeconds % 3600) / 60, (durationSeconds % 60))));
}
@Override
public void onFinish() {
groupViewHolder.draftEnding.setText("Draft Finished");
}
}.start();
}
groupViewHolder.gameType.setText(groupViewHolder.mContestItem.getGameType());
groupViewHolder.accepting.setText(groupViewHolder.mContestItem.getAccepting());
groupViewHolder.gamesInDraft.setText(groupViewHolder.mContestItem.getNbaGamesAmnt());
if (isExpanded) {
groupViewHolder.lobbyItemExpandIndicator.setImageResource(R.drawable.w_dash);
} else {
groupViewHolder.lobbyItemExpandIndicator.setImageResource(R.drawable.w_down);
}
return convertView;
}
public class GroupViewHolder {
TextView draftEnding;
TextView gameType;
TextView accepting;
TextView gamesInDraft;
ImageView lobbyItemExpandIndicator;
CountDownTimer draftCountdownTimer;
ContestItem mContestItem;
long draftCloses;
}
答案 0 :(得分:0)
我再重复一次,你再次从观众看到项目,查看持有人 - 阅读这两个单词并尝试理解它们:
1)viewholder用于保持视图,这意味着它可以保存findViewById等操作的结果(这对应用程序来说很重要)。
2)视图持有者重用视图,不要保留与列表中的项目相关的信息,它仅用于视图!如果您在下一个滚动条中存储信息,则视图所有者可以包含来自其他项目的信息。
3)所有数据信息(包括倒计时)都必须保存在项目模型中,就在您的散列图中,并且必须在onBindViewholder
中从中恢复,只有这样才是正确的方法。
以下是我的代码示例:
在您定义的适配器中:
private HashMap<CategoryModel, List<CategoryModel>> mMainMenuExpandableList; // This is your categories;
private List<CategoryModel> mMainMenuKeysList; // This is your keys to be easier already in separated list;
在构造函数中设置此值:
public CategoriesExpandableListAdapter(HashMap<CategoryModel, List<CategoryModel>> hashMap, List<CategoryModel> keyList){
mMainMenuExpandableList = hashMap;
mMainMenuKeysList = keyList;
}
然后您覆盖getGroup
和getChild
:
@Override
public Object getGroup(int groupPosition) {
return mMainMenuKeysList.get(groupPosition);
}
@Override
public Object getChild(int groupPosition, int childPosition) {
return mMainMenuExpandableList.get(mMainMenuKeysList.get(groupPosition)).get(childPosition);
}
然后在getGroupView
:
final CategoryModel groupObject = (CategoryModel) getGroup(groupPosition);
在getChildView
中你可以让两个对象都行动起来:
CategoryModel groupObject = (CategoryModel) getGroup(groupPosition);
CategoryModel childObject = (CategoryModel) getChild(groupPosition,childPosition);
现在,当您从哈希中获得适当的对象类别时,您可以从该对象获取倒计时并显示它们。
希望这会有所帮助, 祝你有愉快的一天:)