एंड्रॉइड ListView में प्रोग्रामेटिक स्क्रॉलिंग
यह ट्यूटोरियल ListView को विशिष्ट पोजीशन पर स्मूथली या तुरंत स्क्रॉल करने के तरीकों को दर्शाता है।
लेआउट (activity_main.xml)
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="16dp">
<Button
android:id="@+id/btnScroll"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:text="पोजीशन 22 पर स्क्रॉल करें" />
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@id/btnScroll"
android:layout_marginTop="16dp"
android:divider="#EEEEEE"
android:dividerHeight="1dp" />
</RelativeLayout>
MainActivity.java
import android.os.Bundle;
import android.view.View;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ListView listView;
private ArrayAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = findViewById(R.id.listView);
Button btnScroll = findViewById(R.id.btnScroll);
// सैंपल डेटा - 30 आइटम्स
String[] players = {
"क्रिस्टियानो रोनाल्डो", "लियोनेल मेस्सी", "नेमार जूनियर", "ईडन हैज़र्ड", "इस्को",
"गैरेथ बेल", "सर्जियो बुस्केट्स", "ज़्लातान इब्राहिमोविक", "बुफोन", "इकर कैसिलास",
"राफेल वराने", "ज़िनेदिन जिदान", "मेम्फिस डेपे", "जेरार्ड पिक", "विक्टर वाल्डेस",
"डेविड डी गेया", "मो सालाह", "रोनाल्डिन्हो", "मार्को रॉयस", "असेंसियो",
"लुइस फिगो", "सर्जियो रामोस", "मालदिनी", "मार्सेलो", "करीम बेंजेमा",
"सर एलेक्स फर्ग्यूसन", "पेले", "माराडोना", "क्रूइफ", "बेकनबॉयर"
};
List playersList = new ArrayList<>(Arrays.asList(players));
adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, playersList);
listView.setAdapter(adapter);
btnScroll.setOnClickListener(v -> {
int targetPosition = 22; // 0-आधारित इंडेक्स
smoothScrollToPosition(targetPosition);
});
}
private void smoothScrollToPosition(int position) {
if (position >= 0 && position < adapter.getCount()) {
// विधि 1: स्मूथ स्क्रॉल (एनिमेटेड) - अनुशंसित
listView.smoothScrollToPosition(position);
// विधि 2: ऑफसेट के साथ स्मूथ स्क्रॉल (API 11+)
// listView.smoothScrollToPositionFromTop(position, 0, 500); // 500ms ड्यूरेशन
// विधि 3: तुरंत स्क्रॉल (कोई एनिमेशन नहीं)
// listView.setSelection(position);
}
}
}
स्क्रॉल मेथड्स की तुलना
| मेथड | एनिमेशन | उपयोग का मामला |
|---|---|---|
smoothScrollToPosition(pos) |
हाँ | सामान्य उपयोग, बेहतर UX |
smoothScrollToPositionFromTop(pos, offset, duration) |
हाँ (कस्टम ड्यूरेशन) | सटीक पोजीशनिंग, हेडर ऑफसेट |
setSelection(pos) |
नहीं | तुरंत जंप, प्रोग्रामेटिक नेविगेशन |
setSelectionFromTop(pos, offset) |
नहीं | ऑफसेट के साथ तुरंत पोजीशन |
RecyclerView के लिए (मॉडर्न)
// LinearLayoutManager के साथ LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager(); // स्मूथ स्क्रॉल recyclerView.smoothScrollToPosition(position); // या LayoutManager के माध्यम से अधिक नियंत्रण layoutManager.scrollToPositionWithOffset(position, 0);
उन्नत: विशिष्ट व्यू पर स्क्रॉल करना
// किसी विशेष व्यू को विजिबल एरिया में लाने के लिए
View targetView = listView.getChildAt(position - listView.getFirstVisiblePosition());
if (targetView != null) {
targetView.requestFocus();
listView.smoothScrollToPosition(position);
}
// या पोस्ट डिलेड के साथ (लेआउट पूरा होने के बाद)
listView.post(() -> listView.smoothScrollToPosition(position));
सामान्य समस्याएं और समाधान
- स्क्रॉल काम नहीं करता: सुनिश्चित करें कि एडॉप्टर सेट है और डेटा लोडेड है
- गलत पोजीशन: एडॉप्टर में हेडर/फुटर होने पर पोजीशन एडजस्ट करें
- परफॉरमेंस: बड़े डेटासेट के लिए RecyclerView का उपयोग करें