androidlistview索引
㈠ android中如何獲取listview中聚焦的item的索引值
list.setSelection(list.getCount());
list是ListView對象,這個是我剛試過的,可以,也是今天才用的,這行代碼要注意用到list.setAdapter(?)或者adapter.notifyDataSetChanged();之後,就是說,必須listView設置了適配器或者適配器數據源改變之後設置
㈡ android listview如何按時加滾動到頂部
listview的一些方法:
1.public
void setSelection (int position)
position位置的item置頂(即position位置的item到listview的最頂端),但是,沒有從原來位置到頂端的滑動效果。
2.public
void setSelectionFromTop (int position, int y)
與setSelection 類似。setSelection(position)就是setSelectionFromTop (position,0)
選中position指定的項目,並將所選項置於距離ListView頂端y像素的位置
參數
position 需要選中的項目的索引(從0開始)
y
距離ListView(包括間隙)頂端的位置
3.public
void smoothScrollToPositionFromTop (int position, int
offset)
平滑滾動到指定的適配器位置。 指定位置的視圖會滾動到相對頂邊偏移 offset 像素的位置顯示。
如果無法做到(比如該偏移量會使首尾條目超越列表邊緣),會滾動到盡量接近的位置。
參數
position 滾動到的位置
offset 滾動結束時,指定 position 條目距離視圖頂部的像素數
當offset=0時,可以把position位置的item置頂,而且帶有滑動效果,即會從原來位置輕輕滑動到最頂
端位置。
測試:
可以順利滾動,返回滾動也很順利,滑動順暢
4、public void
smoothScrollToPositionFromTop(int position)
參數:
position 滾動到的位置
帶有滑動效果的滾動到指定位置。
如何判斷其內容已滾動到最頂部或者最底部看
getListView().setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if(firstVisibleItem==0){
Log.e("log", "滑到頂部");
}
if(visibleItemCount+firstVisibleItem==totalItemCount){
Log.e("log", "滑到底部");
}
}
});
平滑的滾動listview到一個指定位
package com.android.contacts.widget;
import android.content.Context;
import android.util.AttributeSet;
import android.widget.ListView;
public class AutoScrollListView extends ListView {
private static final
float PREFERRED_SELECTION_OFFSET_FROM_TOP = 0.33f;
private int
mRequestedScrollPosition = -1;
private boolean
mSmoothScrollRequested;
public
AutoScrollListView(Context context) {
super(context);
}
public
AutoScrollListView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public
AutoScrollListView(Context context, AttributeSet attrs, int
defStyle) {
super(context, attrs, defStyle);
}
public void
requestPositionToScreen(int position, boolean smoothScroll) {
mRequestedScrollPosition = position;
mSmoothScrollRequested = smoothScroll;
requestLayout();
}
@Override
protected void
layoutChildren() {
super.layoutChildren();
if (mRequestedScrollPosition == -1) {
return;
}
final int position =
mRequestedScrollPosition;
mRequestedScrollPosition = -1;
int firstPosition = getFirstVisiblePosition() +
1;
int lastPosition =
getLastVisiblePosition();
if (position >= firstPosition &&
position <= lastPosition) {
return; //
Already on screen
}
final int offset = (int) (getHeight() *
PREFERRED_SELECTION_OFFSET_FROM_TOP);
if (!mSmoothScrollRequested) {
setSelectionFromTop(position, offset);
// Since
we have changed the scrolling position, we need to redo child
layout
// Calling
"requestLayout" in the middle of a layout pass has no effect,
// so we
call layoutChildren explicitly
super.layoutChildren();
} else {
// We will
first position the list a couple of screens before or after
// the new
selection and then scroll smoothly to it.
int
twoScreens = (lastPosition - firstPosition) * 2;
int
preliminaryPosition;
if
(position < firstPosition) {
preliminaryPosition = position + twoScreens;
if (preliminaryPosition >=
getCount()) {
preliminaryPosition = getCount() - 1;
}
if (preliminaryPosition <
firstPosition) {
setSelection(preliminaryPosition);
super.layoutChildren();
}
} else
{
preliminaryPosition =
position - twoScreens;
if (preliminaryPosition <
0) {
preliminaryPosition = 0;
}
if
(preliminaryPosition > lastPosition) {
setSelection(preliminaryPosition);
super.layoutChildren();
}
}
smoothScrollToPositionFromTop(position, offset);
}
}
}
㈢ android 怎麼樣獲得listview的滾動條位置
(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。
㈣ 怎麼給listview添加 快速索引條
實現步驟:
1.自定義一個名叫SlideBar 的View。
2.在布局文件中加入這個自定義的View。
3. 在Activity中處理監聽事件。
接下來講講我是怎樣實現的:
先來看SlideBar這個類:
java">packagecom.folyd.tuan.view;
importandroid.content.Context;
importandroid.graphics.Canvas;
importandroid.graphics.Color;
importandroid.graphics.Paint;
importandroid.graphics.Typeface;
importandroid.util.AttributeSet;
importandroid.view.MotionEvent;
importandroid.view.View;
/**
*自定義的View,實現ListViewA~Z快速索引效果
*
*@authorFolyd
*
*/
{
privatePaintpaint=newPaint();
;
//是否畫出背景
privatebooleanshowBg=false;
//選中的項
privateintchoose=-1;
//准備好的A~Z的字母數組
publicstaticString[]letters={"#","A","B","C","D","E","F","G",
"H","I","J","K","L","M","N","O","P","Q","R","S","T",
"U","V","W","X","Y","Z"};
//構造方法
publicSlideBar(Contextcontext){
super(context);
}
publicSlideBar(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
//獲取寬和高
intwidth=getWidth();
intheight=getHeight()-30;
//每個字母的高度
intsingleHeight=height/letters.length;
if(showBg){
//畫出背景
canvas.drawColor(Color.parseColor("#55000000"));
}
//畫字母
for(inti=0;i<letters.length;i++){
paint.setColor(Color.BLACK);
//設置字體格式
paint.setTypeface(Typeface.DEFAULT_BOLD);
paint.setAntiAlias(true);
paint.setTextSize(20f);
//如果這一項被選中,則換一種顏色畫
if(i==choose){
paint.setColor(Color.parseColor("#F88701"));
paint.setFakeBoldText(true);
}
//要畫的字母的x,y坐標
floatposX=width/2-paint.measureText(letters[i])/2;
floatposY=i*singleHeight+singleHeight;
//畫出字母
canvas.drawText(letters[i],posX,posY,paint);
//重新設置畫筆
paint.reset();
}
}
/**
*處理SlideBar的狀態
*/
@Override
(MotionEventevent){
finalfloaty=event.getY();
//算出點擊的字母的索引
finalintindex=(int)(y/getHeight()*letters.length);
//保存上次點擊的字母的索引到oldChoose
finalintoldChoose=choose;
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
showBg=true;
if(oldChoose!=index&&listenner!=null&&index>0
&&index<letters.length){
choose=index;
listenner.onTouchLetterChange(event,letters[index]);
invalidate();
}
break;
caseMotionEvent.ACTION_MOVE:
if(oldChoose!=index&&listenner!=null&&index>0
&&index<letters.length){
choose=index;
listenner.onTouchLetterChange(event,letters[index]);
invalidate();
}
break;
caseMotionEvent.ACTION_UP:
default:
showBg=false;
choose=-1;
if(listenner!=null&&index>0&&index<letters.length)
listenner.onTouchLetterChange(event,letters[index]);
invalidate();
break;
}
returntrue;
}
/**
*回調方法,注冊監聽器
*
*@paramlistenner
*/
(
){
this.listenner=listenner;
}
/**
*SlideBar的監聽器介面
*
*@authorFolyd
*
*/
{
voidonTouchLetterChange(MotionEventevent,Strings);
}
}
然後在布局文件中加入這個自定義的控制項:
<!--上面的代碼省略掉了-->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@drawable/line3"/>
<TextView
android:id="@+id/float_letter"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_gravity="center"
android:background="#F88701"
android:gravity="center"
android:textSize="40sp"
android:visibility="gone"/>
<com.folyd.tuan.view.SlideBar
android:id="@+id/slideBar"
android:layout_width="30dp"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"/>
</FrameLayout>然後在Activity中注冊監聽事件:
mSlideBar
.((){
@Override
publicvoidonTouchLetterChange(MotionEventevent,Strings){
float_letter.setText(s);
switch(event.getAction()){
caseMotionEvent.ACTION_DOWN:
caseMotionEvent.ACTION_MOVE:
float_letter.setVisibility(View.VISIBLE);
break;
caseMotionEvent.ACTION_UP:
default:
float_letter.postDelayed(newRunnable(){
@Override
publicvoidrun(){
float_letter.setVisibility(View.GONE);
}
},100);
break;
}
intposition=array.indexOf(s);//這個array就是傳給自定義Adapter的
mListView.setSelection(position);//調用ListView的setSelection()方法就可實現了
}
});
㈤ android5.0怎麼判斷當前選中的listview的索引值
listView增加一個OnItemClickListener 事件,即條目點擊事件,點擊的時塌旁候會回調onItemClick方法,方法中的 position就是listView的索引值漏衫激。
private OnItemClickListener itemClick = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?>返襪 parent, View view, int position,long id) {
}
}