gpt4 book ai didi

java - 更新 ListView 中的按钮

转载 作者:行者123 更新时间:2023-12-02 06:59:22 26 4
gpt4 key购买 nike

我想更新 ListView 中的按钮。我目前的代码工作正常,但有一个小故障,当到达最后一个项目时,它突然用上一篇文章中的错误数据更新第一个项目,因为它是最后一篇文章。我不知道会发生什么,在我的log 我没有得到任何表明第一个项目正在更新的信息。我从这个similar question得到了这个代码和想法.

这是我使用的代码:

/**
* Updates the like/dislike button states
*/
public void updateButtons() {
ListView lv = ((ListView) findViewById(R.id.post_list));
Log.d("Child Count: ", Integer.toString(lv.getCount()));
int firstVisible;
int child;
for(int i=0; i < lv.getCount(); i++) {
firstVisible = lv.getFirstVisiblePosition() - lv.getHeaderViewsCount();
child = i - firstVisible;
if(child < 0 || child >= lv.getChildCount()) {
continue;
}
if(updated.contains(i)) continue;
Log.d("Debug", "Updating child:" + Integer.toString(child));
LinearLayout row = (LinearLayout) lv.getChildAt(child);
if(likeable.get(i) == 0) {
LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_like);
btn.setClickable(false);
ImageView imgView = (ImageView) row.findViewById(R.id.img_like);
imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_like_selected));
TextView txtView = (TextView) row.findViewById(R.id.text_like);
txtView.setTextColor(Color.parseColor("#60007c"));
}
if(dislikeable.get(i) == 0) {
LinearLayout btn = (LinearLayout) row.findViewById(R.id.btn_dislike);
btn.setClickable(false);
ImageView imgView = (ImageView) row.findViewById(R.id.img_dislike);
imgView.setImageDrawable(getResources().getDrawable(R.drawable.ic_dislike_selected));
TextView txtView = (TextView) row.findViewById(R.id.text_dislike);
txtView.setTextColor(Color.parseColor("#60007c"));
}
Log.d("Debug", "Adding child" + Integer.toString(i) + "TO the updated list");
updated.add(i);
}
}

每次用户滚动 ListView 时我都会运行此代码:

ListView lv = ((ListView) findViewById(R.id.post_list));
lv.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
updateButtons();
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
updateButtons();
}
});

最佳答案

不太清楚问题出在哪里。当您通过滚动到达最后一项时,第一项(来自适配器的项或第一个可见的项)会再次更新吗?

我个人的观点是,你处理这个问题的方式是错误的。从问题来看,您似乎想更新 ListView 的每一行中的一些按钮。 。您应该通过更新适配器中的数据并调用 notifyDataSetChanged() 来完成此操作。而不是使用OnScrollListener 。这对于用户操作(喜欢/不喜欢的项目)来说是有意义的,我怀疑您在用户滚动上创建了一个非常尴尬的喜欢/不喜欢系统。

此外,使用 lv.getCount() 是没有意义的。如果您只想触摸可见行,则迭代所有适配器项目(使用您当前执行的代码,您也可以一次性在适配器中进行更新并调用 notifyDatasetChanged() )。使用getFirstVisiblePosition()getLastVisiblePosition() 。您可以通过不调用 updateButtons() 来优化代码方法,除非由于滚动而在屏幕上出现新行,您可以从 onScroll() 的参数观察/计算。方法(我看到一个 updated 列表,其中包含已更新的项目?!)。

关于java - 更新 ListView 中的按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16872386/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com