ฉันจะเลื่อนไปที่ตำแหน่งใดตำแหน่งหนึ่งในโปรแกรมได้ListView
อย่างไร
ตัวอย่างเช่นผมมีString[] {A,B,C,D....}
และผมจำเป็นต้องตั้งค่ารายการที่มองเห็นด้านบนของListView
ที่จะดัชนี 21 String[]
ของฉัน
ฉันจะเลื่อนไปที่ตำแหน่งใดตำแหน่งหนึ่งในโปรแกรมได้ListView
อย่างไร
ตัวอย่างเช่นผมมีString[] {A,B,C,D....}
และผมจำเป็นต้องตั้งค่ารายการที่มองเห็นด้านบนของListView
ที่จะดัชนี 21 String[]
ของฉัน
คำตอบ:
สำหรับการเลื่อนโดยตรง:
getListView().setSelection(21);
สำหรับการเลื่อนที่ราบรื่น:
getListView().smoothScrollToPosition(21);
smoothScrollToPosition
ไม่ทำงานข้อเสนอแนะใด ๆ
listView.post(() -> listView.smoothScrollToPosition());
getListView().smoothScrollToPositionFromTop(position,offset,duration);
ตำแหน่งพารามิเตอร์-> ตำแหน่งที่จะเลื่อนเพื่อ
ชดเชย ----> ระยะทางที่ต้องการเป็นพิกเซลของตำแหน่งจากด้านบนของมุมมองเมื่อการเลื่อนเสร็จสิ้น
ระยะเวลา -> จำนวนมิลลิวินาทีที่จะใช้สำหรับการเลื่อน
หมายเหตุ:จาก API 11
คำตอบของ HandlerExploit คือสิ่งที่ฉันกำลังมองหา แต่มุมมองรายการของฉันค่อนข้างยาวและมีตัวเลื่อนตัวอักษร จากนั้นฉันก็พบว่าฟังก์ชั่นเดียวกันสามารถรับพารามิเตอร์อื่น ๆ ได้ด้วย :)
แก้ไข: (จากข้อเสนอแนะของ AFD)
วิธีวางตำแหน่งตัวเลือกปัจจุบัน:
int h1 = mListView.getHeight();
int h2 = listViewRow.getHeight();
mListView.smoothScrollToPositionFromTop(position, h1/2 - h2/2, duration);
ใส่รหัสของคุณในตัวจัดการดังต่อไปนี้
public void timerDelayRunForScroll(long time) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
try {
lstView.smoothScrollToPosition(YOUR_POSITION);
} catch (Exception e) {}
}
}, time);
}
แล้วเรียกวิธีนี้ว่า
timerDelayRunForScroll(100);
ไชโย !!!
ฉันได้ตั้งค่า OnGroup ขยายฟังและแทนที่ onGroup ขยาย () เป็น:
และใช้วิธี setSelectionFromTop () ซึ่งตั้งค่ารายการที่เลือกและวางตำแหน่งพิกเซลการเลือกจากขอบด้านบนของ ListView (หากอยู่ในโหมดสัมผัสรายการจะไม่ถูกเลือก แต่จะยังคงอยู่ในตำแหน่งที่เหมาะสม) (เอกสาร Android)
yourlist.setOnGroupExpandListener (new ExpandableListView.OnGroupExpandListener()
{
@Override
public void onGroupExpand(int groupPosition) {
expList.setSelectionFromTop(groupPosition, 0);
//your other code
}
});
การListview
เลื่อนจะถูกจัดตำแหน่งให้อยู่ด้านบนเป็นค่าเริ่มต้น แต่ต้องการเลื่อนหากไม่สามารถมองเห็นได้ให้ใช้:
if (listView1.getFirstVisiblePosition() > position || listView1.getLastVisiblePosition() < position)
listView1.setSelection(position);
หากมีคนกำลังมองหาฟังก์ชั่นที่คล้ายกันเช่นแอพ Gmail
เลื่อนมุมมอง Listview จะถูกวางตำแหน่งไปด้านบนโดยค่าเริ่มต้น ขอบคุณสำหรับคำใบ้ amalBit เพียงลบออก แค่นั้นแหละ.
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
int h1 = mDrawerList.getHeight();
int h2 = header.getHeight();
mDrawerList.smoothScrollToPosition(h2-h1);
}
}, 1000);
การจัดการ listView scrolling โดยใช้ UP / Down using.button
หากมีใครสนใจจัดการรายการดูปุ่มขึ้น / ลงหนึ่งแถว แล้วก็
public View.OnClickListener onChk = new View.OnClickListener() {
public void onClick(View v) {
int index = list.getFirstVisiblePosition();
getListView().smoothScrollToPosition(index+1); // For increment.
}
});
หากคุณต้องการข้ามไปยังตำแหน่งที่ต้องการโดยตรงใน listView เพียงแค่ใช้
listView.setSelection (ตำแหน่ง int);
และถ้าคุณต้องการข้ามไปยังตำแหน่งที่ต้องการอย่างราบรื่นใน listView เพียงแค่ใช้
listView.smoothScrollToPosition (ตำแหน่ง int);
นี่คือสิ่งที่ได้ผลสำหรับฉัน การรวมกันของคำตอบโดย amalBit & Melbourne Lopes
public void timerDelayRunForScroll(long time) {
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
public void run() {
try {
int h1 = mListView.getHeight();
int h2 = v.getHeight();
mListView.smoothScrollToPositionFromTop(YOUR_POSITION, h1/2 - h2/2, 500);
} catch (Exception e) {}
}
}, time);
}
แล้วเรียกวิธีการนี้เช่น:
timerDelayRunForScroll(400);
รายการ list-view.set ง่าย ๆ (คุณ pos); หรือคุณสามารถบันทึกตำแหน่งของคุณด้วย sharedprefrence และเมื่อคุณเริ่มต้นกิจกรรมก็จะได้รับการกำหนดค่าตามความชอบและการตั้งค่าให้เป็น int
- หากคุณต้องการให้รายการเลื่อนขึ้นไปยังตำแหน่งเฉพาะ:
myListView.smoothScrollToPosition(i);
หากคุณต้องการรับตำแหน่งของรายการเฉพาะใน myListView:
myListView.getItemAtPosition(i);
- นอกจากนี้myListView.getVerticalScrollbarPosition(i);
ยังช่วยคุณได้
โชคดี :)
คุณต้องการสองสิ่งในการกำหนดตำแหน่งการเลื่อนของ listView อย่างแม่นยำ:
วิธีรับรายการปัจจุบันเลื่อนดูตำแหน่ง:
int firstVisiblePosition = listView.getFirstVisiblePosition();
int topEdge=listView.getChildAt(0).getTop(); //This gives how much the top view has been scrolled.
ในการตั้ง listView scroll position:
listView.setSelectionFromTop(firstVisiblePosition,0);
// Note the '-' sign for scrollTo..
listView.scrollTo(0,-topEdge);
ฉันพบวิธีนี้เพื่อให้เลื่อนขึ้นและลงโดยใช้สองปุ่มที่แตกต่างกัน
ตามที่แนะนำโดย @Nepster ฉันใช้การเลื่อนโดยใช้โปรแกรมโดยใช้ getFirstVisiblePosition () และ getLastVisiblePosition () เพื่อรับตำแหน่งปัจจุบัน
final ListView lwresult = (ListView) findViewById(R.id.rds_rdi_mat_list);
.....
if (list.size() > 0) {
ImageButton bnt = (ImageButton) findViewById(R.id.down_action);
bnt.setVisibility(View.VISIBLE);
bnt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(lwresult.getLastVisiblePosition()<lwresult.getAdapter().getCount()){
lwresult.smoothScrollToPosition(lwresult.getLastVisiblePosition()+5);
}else{
lwresult.smoothScrollToPosition(lwresult.getAdapter().getCount());
}
}
});
bnt = (ImageButton) findViewById(R.id.up_action);
bnt.setVisibility(View.VISIBLE);
bnt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
if(lwresult.getFirstVisiblePosition()>0){
lwresult.smoothScrollToPosition(lwresult.getFirstVisiblePosition()-5);
}else{
lwresult.smoothScrollToPosition(0);
}
}
});
}