gpt4 book ai didi

android - 动态设置Listview高度后正确检测Listview中的setOnScrollListener

转载 作者:搜寻专家 更新时间:2023-11-01 09:47:34 25 4
gpt4 key购买 nike

我在 Viewpager 中使用 listview,我需要根据子项设置 ListView 高度,并且当用户滚动到 Listview 的最后一个位置时我需要添加新项目。但问题是当我动态设置 ListView 高度时,它使当前 ListView 项目可见(或选中)。这就是为什么自动获取(调用方法获取数据)的原因。代码如下:

int index = lvNetwork.getFirstVisiblePosition();
View v = lvNetwork.getChildAt(0);
int top = (v == null) ? 0 : v.getTop();

adapter = new NetworkAdapter(activity, R.layout.network_custom_row, networkDataArrayList);
adapter.notifyDataSetChanged();
lvNetwork.setAdapter(adapter);
Utils.setlistViewHeight(lvNetwork, activity);

lvNetwork.setSelectionFromTop(index, top);

lvNetwork.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {

}

@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {

int finalItem = firstVisibleItem + visibleItemCount;

Log.d("dataCalling", "visible " + finalItem);
Log.d("dataCalling", "total " + totalItemCount);

if (finalItem == totalItemCount) {

if (preLast != finalItem) {
preLast = finalItem;
Log.d("dataCalling", String.valueOf(totalItemCount));
Log.d("dataCalling", "Page " + nextid);
progressBar.setVisibility(View.VISIBLE);

getNetworkFeed();

}
}
}
});

Utils 中的 setlistviewHeight 方法,

public static void setlistViewHeight(ListView listView, Context context) {

ListAdapter myListAdapter = listView.getAdapter();

if (myListAdapter == null) {
return;
}

int totalHeight = 0;
for (int size = 0; size < myListAdapter.getCount(); size++) {

View listItem = myListAdapter.getView(size, null, listView);
if (listItem instanceof ViewGroup)
listItem.setLayoutParams(new RelativeLayout.LayoutParams(
RelativeLayout.LayoutParams.WRAP_CONTENT,
RelativeLayout.LayoutParams.WRAP_CONTENT));

WindowManager wm = (WindowManager) context
.getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
@SuppressWarnings("deprecation")
int screenWidth = display.getWidth();
int listViewWidth = screenWidth - 65;
int widthSpec = View.MeasureSpec.makeMeasureSpec(listViewWidth,
View.MeasureSpec.AT_MOST);
listItem.measure(widthSpec, 0);

totalHeight += listItem.getMeasuredHeight();
}

ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight
+ (listView.getDividerHeight() * (myListAdapter.getCount()));
listView.setLayoutParams(params);
listView.requestLayout();
}

*** 如果我不需要动态设置 listview 高度,这段代码效果很好。我应该在这里更改什么以使其工作或任何替代解决方案以获得期望的结果?

我们将不胜感激。

最佳答案

But the problem is when I am setting listview height dynamically its making current listview item visible

动态设置高度不是问题。相反,问题是您通过计算列表中每个项目的高度将 ListView 的高度设置为 ListView 的最大可能高度。所以会发生的是 ListView 的所有项目将立即填充并在列表中保持膨胀。(注意:现在不会发生 View 回收)

That's why getting (calling method to get data) automatically

发生调用是因为您正在根据列表中的项目总数设置 ListView 的高度。因此, ListView 中的所有元素在任何给定时间点都将处于可见状态。也就是说你的情况

if (finalItem == totalItemCount){}

将始终为真,因为您的 visibleItemCount 将始终为 totalItemCount,这使得您的最终项目始终等于 totalItemCount。 (您可以通过调试您的应用来验证这一点)。

What should I change here to make it work or any alternative solution to get desire result?

我能想到的最好的解决方案是当且仅当您根据所有项目的高度计算出的总高度小于屏幕高度时才设置 ListView 的高度。否则,将 ListView 的高度设置为 MATCH_PARENT

ViewGroup.LayoutParams params = listView.getLayoutParams();
Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int height = size.y;
if(totalHeight > height){
params.height = ViewGroup.LayoutParams.MATCH_PARENT;
}else {
Log.d("", "");
params.height = totalHeight
+ (listView.getDividerHeight() * (myListAdapter.getCount()));
}

因此,此代码将阻止使 ListView 的所有 View 变得可见,因此您将收到 onScroll visibleItemCount,当前可见的项目数。

关于android - 动态设置Listview高度后正确检测Listview中的setOnScrollListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37251659/

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