扫二维码与项目经理沟通
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流
动态改变控件位置的方法:
10多年的高淳网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。成都全网营销的优势是能够根据用户设备显示端的尺寸不同,自动调整高淳建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“高淳网站设计”,“高淳网站推广”以来,每个客户项目都认真落实执行。
setPadding()的方法更改布局位置。
如我要把Imageview下移200px:
ImageView.setPadding( ImageView.getPaddingLeft(), ImageView.getPaddingTop()+200,
ImageView.getPaddingRight(), ImageView.getPaddingBottom());
动态改变控件大小的方法:
1、声明控件参数获取对象 LayoutParams lp;
2、获取控件参数: lp = 控件id.getLayoutParams();
3、设置控件参数:如高度。 lp.height -= 10;
4:、使设置生效:控件id.setLayoutParams(lp);
有2种方法可以设置TextView文字居中:\x0d\x0a一:在xml文件设置:android:gravity="center"\x0d\x0a二:在程序中设置:m_TxtTitle.setGravity(Gravity.CENTER);\x0d\x0a\x0d\x0a备注:android:gravity和android:layout_gravity的区别在于前者对控件内部操作,后者是对整个控件操作。\x0d\x0a例如:\x0d\x0aandroid:gravity="center"是对textView中文字居中\x0d\x0aandroid:layout_gravity="center"是对textview控件在整个布局中居中\x0d\x0a其实很容易理解,出现"layout"就是控件对整个布局的操作\x0d\x0a\x0d\x0aTextView文字垂直靠左居中,\x0d\x0a\x0d\x0a设置android:gravity="center_vertical|left"。\x0d\x0a\x0d\x0aandroid:gravity="center", 垂直水平居中\x0d\x0aLinearLayout有两个非常相似的属性:android:gravity与android:layout_gravity。他们的区别在于:android:gravity用于设置View组件的对齐方式,而android:layout_gravity用于设置Container组件的对齐方式。\x0d\x0a举个例子,我们可以通过设置android:gravity="center"来让EditText中的文字在EditText组件中居中显示;同时我们设置EditText的android:layout_gravity="right"来让EditText组件在LinearLayout中居中显示。\x0d\x0a
亲,记得好评哟!
在android的开发中,经常会遇到需要主动去设定某条ListItem的位置的需求。设置位置的函数有
ListView.setSelection(int position)
ListView.setSelectionFromTop(int position, int y);
其中
position指的是指定的item的在ListView中的索引,注意如果有Header存在的情况下,索引是从Header就开始算的。
y指的是到ListView可见范围内最上边边缘的距离。
函数有了,现在就是根据自身需求来进行设置。
这次遇到的需求,ListView要求是从下往上展示的,并且当Cursor更新时,要保持住原先的最上方的item(不包括header)的位置不变,然后新的历史数据在原先那条item上方继续向上展示。如图:
ListView从下往上展示,也就是
android:stackFromBottom="true"
但是发现这一属性的设置不会影响索引的排序顺序,也就是item的索引都是从上往下递增的,不会变成从下往上递增。索引为0的item,都是在ListView的最上方的item(或header).
那么当Cursor更新时,原先第一条的索引便会发生变化。要想保持住它(图中的 R)的位置。步骤如下:
(1)获取这一条在新Cursor中的位置(posiition)
(2)获取这一条在更换Cursor后ListView中的位置。
(4)由于ListView的可滚动的属性,我们需要记录更换Cursor前可视的第一条item的索引(ListView.getFirstVisiblePosition())
(3)区分FirstVisiblePosition是0和大于0的情况。由于header,也就是图中的Loading那一条在新数据出来后是会消失的。
(4)当FirstVisiblePosition为0时实际指向的是header,我们要保持位置不变的是header下面第一条(R)的位置。那么此时要设置FirstVisiblePosition为1
(5)当FirstVisiblePosition大于0时实际指向的就是item,但是我们需要设置FirstVisiblePosition为0。*
(6)我们根据FirstVisiblePosition用ListView.getChildAt(int position)函数获取对应的item的View,再根据View.getTop()函数获取到ListView顶部的距离Y。
这样ListView.setSelectionFromTop(int position, int y)所需的两个参数 position 和 y就都有了。
*注解:ListView.getChildAt(int position), 这个position指的是在可视的item中的索引,跟cursor里的位置是大不一样的。可以看看ListView.getChildCount()函数得到个数是小于或等于Cursor里的个数的(不考虑header的话)。虽然一共可能有20条数据,但是界面只能看到8条,那么这个ChildCount大约就是8了。另一方面, FirstVisiblePosition取出的是在总的条数中的索引,再将会消失的header考虑进来,所以就是 FirstVisiblePosition为0时要设为1,大于0时又要设为0。
下面上代码:
调用的代码:
int headerCount = mListContainer.getListView().getHeaderViewsCount();
int firstVisiblePos = mListContainer.getListView().getFirstVisiblePosition();
int newCursorPosition = getPositionInNewCursor(cursor.getCount(), firstVisiblePos);
int offsetY = getOffsetY(cursor, firstVisiblePos, newCursorPosition);
mAdapter.changeCursor(cursor);
mUpRefreshLayout.setVisibility(View.GONE);
mListContainer.getListView().setSelectionFromTop(newCursorPosition + headerCount, offsetY);
getPositionInNewCursor函数:
private int getPositionInNewCursor(int newCursorCount, int firstVisiblePos){
if(firstVisiblePos == 0){
firstVisiblePos += 1;
}
int headerCount = mListContainer.getListView().getHeaderViewsCount();
int newCursorPos = newCursorCount - mAdapter.getCount() + firstVisiblePos - headerCount;
return newCursorPos;
}
getOffsetY函数:
private int getOffsetY(Cursor cursor, int firstVisiblePos, int newCursorPosition){
int y;
View firstVisibleItem = null;
if(firstVisiblePos == 0){
firstVisibleItem = mListContainer.getListView().getChildAt(1);
}else{
firstVisibleItem = mListContainer.getListView().getChildAt(0);
}
y = firstVisibleItem.getTop();
View timeView = firstVisibleItem.findViewById(R.id.time_text_view);
if(timeView != null timeView.getVisibility() == View.VISIBLE){
Cursor curItem = (Cursor)mAdapter.getItem(newCursorPosition);
Cursor preItem = (Cursor)mAdapter.getItem(newCursorPosition - 1);
if(curItem != null || preItem != null){
long curTimeStamp = curItem.getLong(MessagesProjection.JEDI_CREATE_DATE_INDX);
long preTimeStamp = preItem.getLong(MessagesProjection.JEDI_CREATE_DATE_INDX);
if(Math.abs(curTimeStamp - preTimeStamp) = SHOW_TIME_STAMP_TEN_MINS){
LayoutParams param = (LinearLayout.LayoutParams)mTimeView.getLayoutParams();
y += mTimeView.getHeight() + param.topMargin + param.bottomMargin;
}
}
}
return y;
}
getOffsetY中有一段计算图中TimeStamp的高度的代码,不关心的可以自己跳过一下。
我们在微信上24小时期待你的声音
解答本文疑问/技术咨询/运营咨询/技术建议/互联网交流