我有子视线LinearLayout的scrollview。我正在为它添加programmaticaly数据。当我将一些数据添加到linearlayout的顶部时,它会自动滚动到顶部元素。但我想要的东西,用户达到顶部 - >向上滚动以加载以前的数据 - >将数据添加到linearlayout top但不应该获得焦点,添加完成后,如果用户滚动然后只显示它。
如何实现这一目标?
答案 0 :(得分:1)
嗯,我想到了一种方式,它的工作方式几乎完美。
我在ScrollView(svCommunications)中有一个LinearLayout(llCommunicationsLayout)。
我给一个新的LinearLayout充气,我要在这个新的LinearLayout顶部添加视图,然后将这个新的布局添加到ScrollView内的LinearLayout。
这是新的布局:
final LinearLayout wrapperLayout = (LinearLayout) mInflater.inflate(R.layout.empty_layout, null);
我将我的观点添加到此布局的第0位。
wrapperLayout.addView(view, 0);
将所有视图添加到wrapperLayout后,我将wrapperLayout添加到llCommunicationsLayout(我的ScrollView中的那个)
llCommunicationsLayout.addView(wrapperLayout, 0);
在此之后,我在wrapperLayout在屏幕上(具有可测量的高度)后计算它们的高度
wrapperLayout.post(new Runnable() {
@Override
public void run() {
int wrapperHeight = wrapperLayout.getHeight();
int svHeight = svCommunications.getHeight();
int scrollHeight = Math.abs(svHeight - wrapperHeight);
DisplayMetrics displaymetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displaymetrics);
int displayHeight = displaymetrics.heightPixels / 4;
svCommunications.scrollTo(0, (scrollHeight + displayHeight));
}
});
在这里,我获得了新添加的布局和ScrollView的高度。
我计算它们的差异,加上我设备屏幕高度的1/4并滚动它,瞧!
它并不完美,但在添加布局后,它不再滚动到屏幕顶部。尝试使用displayHeight获取不同的结果。
希望这可以帮助别人。
答案 1 :(得分:0)
您可以抓取位于LinearLayout顶部的当前视图,然后将新内容添加到LinearLayout,然后滚动回查看之前位于顶部的视图。代码类似于:
public void addViewsOnTop(List<View> views) {
final View currentViewOnTop = (linearLayout.getChildCount() > 0) ? linearLayout.getChildAt(0) : null;
// Add Views. Note that views will appear in reverse order
for(View view : views) {
linearLayout.addView(view, 0);
}
// Scroll back to view which was on top
if(currentViewOnTop != null) {
new Handler().post(new Runnable() {
@Override
public void run() {
scrollView.scrollTo(0, currentViewOnTop.getBottom());
}
});
}
}
答案 2 :(得分:-1)
解决.... 试试这个,为我工作,
lv_chat.setAdapter(适配器); lv_chat.setSelection(somePreviousPosition);