উত্তর:
সম্পাদিত :
যেহেতু আমি আমার একটি অ্যাপ্লিকেশনটিতে এই বিশেষ বিষয়ে তদন্ত করছি তাই আমি এই প্রশ্নের ভবিষ্যতের পাঠকদের জন্য একটি বর্ধিত উত্তর লিখতে পারি।
একটি বাস্তবায়ন OnScrollListener
, আপনার সেট ListView
এর onScrollListener
এবং তারপর আপনি কিছু সঠিকভাবে পরিচালনা করতে সক্ষম হওয়া উচিত।
উদাহরণ স্বরূপ:
private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);
// ... ... ...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount)
{
switch(lw.getId())
{
case R.id.your_list_id:
// Make your calculation stuff here. You have all your
// needed info from the parameters of this function.
// Sample calculation to determine if the last
// item is fully visible.
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount)
{
if(preLast!=lastItem)
{
//to avoid multiple calls for last item
Log.d("Last", "Last");
preLast = lastItem;
}
}
}
}
listview
কী করব stackFromBottom
? আমি চেষ্টা করেছি if (0 == firstVisibleItem){//listviewtop}
কিন্তু বারবার ফোন করা হচ্ছে।
দেরিতে উত্তর, তবে যদি আপনি কেবল ইভেন্ট শ্রোতা তৈরি না করেই আপনার তালিকার ভিউটি পুরোভাবে নিচে স্ক্রল করা আছে কিনা তা যদি আপনি খতিয়ে দেখতে চান তবে আপনি এই-বিবৃতিটি ব্যবহার করতে পারেন:
if (yourListView.getLastVisiblePosition() == yourListView.getAdapter().getCount() -1 &&
yourListView.getChildAt(yourListView.getChildCount() - 1).getBottom() <= yourListView.getHeight())
{
//It is scrolled all the way down here
}
প্রথমে এটি চেক করে শেষ সম্ভাব্য অবস্থানটি দেখছে কিনা। তারপরে এটি চেক করে যে শেষ বোতামটির নীচে তালিকাটি তালিকার নীচের সাথে একত্রিত হয় কিনা। এটি শীর্ষে সমস্ত উপায়ে রয়েছে কিনা তা জানতে আপনি অনুরূপ কিছু করতে পারেন:
if (yourListView.getFirstVisiblePosition() == 0 &&
yourListView.getChildAt(0).getTop() >= 0)
{
//It is scrolled all the way up here
}
getChildCount()
ভিউগ্রুপে মতামতগুলি ফিরিয়ে দেয়, যা ভিউ রিসাইক্লিং সহ অ্যাডাপ্টারের আইটেমের সংখ্যার মতো নয়। যাইহোক, getCount()
তালিকার ভিউ অ্যাডাপ্টারভিউ থেকে অবতরণ করে আপনি সরাসরি তালিকাভিউতে ব্যবহার করতে পারেন ।
আমি যেভাবে এটি করেছি:
listView.setOnScrollListener(new AbsListView.OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE
&& (listView.getLastVisiblePosition() - listView.getHeaderViewsCount() -
listView.getFooterViewsCount()) >= (adapter.getCount() - 1)) {
// Now your listview has hit the bottom
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
}
});
এর প্রভাব কিছু:
if (getListView().getLastVisiblePosition() == (adapter.items.size() - 1))
public void onScrollStateChanged(AbsListView view, int scrollState)
{
if (!view.canScrollList(View.SCROLL_AXIS_VERTICAL) && scrollState == SCROLL_STATE_IDLE)
{
//When List reaches bottom and the list isn't moving (is idle)
}
}
এটি আমার পক্ষে কাজ করেছে।
এটা হতে পারে
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
if (scrollState == 2)
flag = true;
Log.i("Scroll State", "" + scrollState);
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
if ((visibleItemCount == (totalItemCount - firstVisibleItem))
&& flag) {
flag = false;
Log.i("Scroll", "Ended");
}
}
স্ক্রোলিংয়ের সাথে মোকাবিলা করার জন্য এটি বেশ বেদনাদায়ক ছিল, এটি শেষ হয়ে গেছে তা সনাক্ত করে এবং এটি প্রকৃতপক্ষে তালিকার নীচে রয়েছে (দৃশ্যমান পর্দার নীচে নয়) এবং ওয়েব থেকে ডেটা আনতে আমার পরিষেবাটি একবারেই ট্রিগার করে। তবে এটি এখন ভাল কাজ করছে। কোডটি একই পরিস্থিতির মুখোমুখি কারও উপকারের জন্য নীচে রয়েছে।
দ্রষ্টব্য: আমাকে আমার অ্যাডাপ্টার সম্পর্কিত কোডটি অনক্রিটের পরিবর্তে অনভিউ তৈরিতে সরানো হয়েছিল এবং প্রাথমিকভাবে স্ক্রোলিং সনাক্ত করতে হয়েছিল:
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
public void onScrollStateChanged(AbsListView view, int scrollState) {
if (getListView().getLastVisiblePosition() == (adapter.getCount() - 1))
if (RideListSimpleCursorAdapter.REACHED_THE_END) {
Log.v(TAG, "Loading more data");
RideListSimpleCursorAdapter.REACHED_THE_END = false;
Intent intent = new Intent(getActivity().getApplicationContext(), FindRideService.class);
getActivity().getApplicationContext().startService(intent);
}
}
এখানে রাইডলিস্টসিম্পলসার্সার অ্যাডাপ্টার REআরচED_THE_END আমার সিম্পল কাস্টম অ্যাডাপ্টারে একটি অতিরিক্ত পরিবর্তনশীল যা এটি সেট করা আছে:
if (position == getCount() - 1) {
REACHED_THE_END = true;
} else {
REACHED_THE_END = false;
}
কেবলমাত্র যখন এই উভয় শর্তই মিলিত হয়, এর অর্থ হ'ল আমি প্রকৃতপক্ষে তালিকার নীচে এবং আমার পরিষেবা কেবল একবারে চলবে। যদি আমি REACHED_THE_END না ধরি, এমনকি পিছনের দিকে স্ক্রোল করাও পরিষেবাটি আবার ট্রিগার করে, যতক্ষণ না শেষ আইটেমটি দেখা যাবে।
canScrollVertically(int direction)
সমস্ত দর্শনের জন্য কাজ করে এবং অন্যান্য উত্তরগুলির চেয়ে কম কোড সহ আপনি যা বলেছিলেন তা করে বলে মনে হচ্ছে। একটি ধনাত্মক সংখ্যায় প্লাগ করুন এবং ফলাফলটি যদি ভুল হয় তবে আপনি নীচে রয়েছেন।
অর্থাৎ,
if (!yourView.canScrollVertically(1)) {
//you've reached bottom
}
উপরের উত্তরগুলির একটিতে কিছুটা প্রসারিত করতে, এটি সম্পূর্ণরূপে কাজ করার জন্য আমাকে এই কাজটি করতে হয়েছিল। তালিকাভিউগুলির অভ্যন্তরে প্রায় 6dp অন্তর্নির্মিত প্যাডিং রয়েছে বলে মনে হয়, এবং তালিকাটি খালি থাকলে অনস্ক্রোল () কল করা হত called এটি এই দুটি জিনিসই পরিচালনা করে। এটি সম্ভবত কিছুটা অপ্টিমাইজ করা যেতে পারে তবে স্বচ্ছতার জন্য এটি আরও লেখা হয়।
পার্শ্ব দ্রষ্টব্য: আমি পিক্সেল রূপান্তর কৌশলগুলিতে বিভিন্ন ডিপি চেষ্টা করেছি এবং এই dp2px () সবচেয়ে ভাল হয়েছে।
myListView.setOnScrollListener(new OnScrollListener() {
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (visibleItemCount > 0) {
boolean atStart = true;
boolean atEnd = true;
View firstView = view.getChildAt(0);
if ((firstVisibleItem > 0) ||
((firstVisibleItem == 0) && (firstView.getTop() < (dp2px(6) - 1)))) {
// not at start
atStart = false;
}
int lastVisibleItem = firstVisibleItem + visibleItemCount;
View lastView = view.getChildAt(visibleItemCount - 1);
if ((lastVisibleItem < totalItemCount) ||
((lastVisibleItem == totalItemCount) &&
((view.getHeight() - (dp2px(6) - 1)) < lastView.getBottom()))
) {
// not at end
atEnd = false;
}
// now use atStart and atEnd to do whatever you need to do
// ...
}
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
});
private int dp2px(int dp) {
return (int)TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, getResources().getDisplayMetrics());
}
আমি এখনও মন্তব্য করতে পারি না কারণ আমি যথেষ্ট খ্যাতি পাইনি, তবে @ আলি ইমরান এবং @ ব্রোকলাইয়ের উত্তরে আমি মনে করি যে কিছু অনুপস্থিত। সেই কোডের টুকরো দিয়ে, আপনি একবার প্রিলাস্ট আপডেট করলে এটি আর কখনও লগকে কার্যকর করবে না। আমার নির্দিষ্ট সমস্যাটিতে আমি নীচে স্ক্রোল করার সময় আমি কিছু অপারেশন চালিয়ে যেতে চাই, তবে একবার লাস্ট আইটেমে প্রিলাস্ট আপডেট হয়ে গেলে সেই অপারেশনটি আর কখনও চালানো হয় না।
private int preLast;
// Initialization stuff.
yourListView.setOnScrollListener(this);
// ... ... ...
@Override
public void onScroll(AbsListView lw, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount) {
switch(lw.getId()) {
case android.R.id.list:
// Make your calculation stuff here. You have all your
// needed info from the parameters of this function.
// Sample calculation to determine if the last
// item is fully visible.
final int lastItem = firstVisibleItem + visibleItemCount;
if(lastItem == totalItemCount) {
if(preLast!=lastItem){ //to avoid multiple calls for last item
Log.d("Last", "Last");
preLast = lastItem;
}
} else {
preLast = lastItem;
}
}
সেই "অন্য" সাথে আপনি এখন প্রত্যেকবার নীচে স্ক্রোল করে আপনার কোডটি (লগ, এই ক্ষেত্রে) সম্পাদন করতে সক্ষম হবেন।
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
int lastindex = view.getLastVisiblePosition() + 1;
if (lastindex == totalItemCount) { //showing last row
if ((view.getChildAt(visibleItemCount - 1)).getTop() == view.getHeight()) {
//Last row fully visible
}
}
}
আপনার তালিকাটি কল করার জন্য যখন তালিকাটি সর্বশেষে পৌঁছায় এবং যদি কোনও ত্রুটি ঘটে তবে এটি এন্ডোফালিস্টভিউটিকে আর কল করবে না । এই কোডটি এই দৃশ্যের পাশাপাশি সহায়তা করবে।
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
final int lastPosition = firstVisibleItem + visibleItemCount;
if (lastPosition == totalItemCount) {
if (previousLastPosition != lastPosition) {
//APPLY YOUR LOGIC HERE
}
previousLastPosition = lastPosition;
}
else if(lastPosition < previousLastPosition - LIST_UP_THRESHOLD_VALUE){
resetLastIndex();
}
}
public void resetLastIndex(){
previousLastPosition = 0;
}
যেখানে LIST_UP_THRESHOLD_VALUE যে কোনও পূর্ণসংখ্যার মান হতে পারে (আমি 5 ব্যবহার করেছি) যেখানে আপনার তালিকাটি স্ক্রোল করা আছে এবং শেষে ফিরে আসার পরে, এটি আবার তালিকার শেষের দিকে কল করবে।
পরের পৃষ্ঠাগুলি এমনভাবে স্বয়ংক্রিয়ভাবে লোড করার জন্য আমি খুব সুন্দর একটি উপায় পেয়েছি যাতে নিজের নিজের প্রয়োজন হয় না ScrollView
(যেমন স্বীকৃত উত্তরের প্রয়োজন হয়)।
উপর ParseQueryAdapter একটি পদ্ধতি বলা আছে getNextPageView
যে আপনি আপনার নিজস্ব দৃশ্য সরবরাহ সেই তালিকাটি যখন লোড আরো ডেটা আছে শেষে প্রদর্শিত হয় তাই এটি শুধুমাত্র আরম্ভ হবে যখন আপনি আপনার বর্তমান পৃষ্ঠার সেট শেষে পৌঁছেছেন করার অনুমতি (এটি "লোড আরও .." ডিফল্টরূপে দেখুন)। লোড করার জন্য আরও ডেটা থাকলে এই পদ্ধতিটি কেবল তখনই কল করা হয় তাই কল করার জন্য loadNextPage();
এটি দুর্দান্ত জায়গা place নতুন ডেটা কখন লোড করা উচিত তা নির্ধারণ করার জন্য অ্যাডাপ্টারটি আপনার জন্য সমস্ত কঠোর পরিশ্রম করে এবং আপনার যদি এটি থাকে তবে একেবারেই কল করা হবে না ডেটা সেট শেষে পৌঁছেছে।
public class YourAdapter extends ParseQueryAdapter<ParseObject> {
..
@Override
public View getNextPageView(View v, ViewGroup parent) {
loadNextPage();
return super.getNextPageView(v, parent);
}
}
তারপরে আপনার ক্রিয়াকলাপ / খণ্ডের ভিতরে আপনাকে কেবল অ্যাডাপ্টার সেট করতে হবে এবং যাদু করার মতো নতুন ডেটা স্বয়ংক্রিয়ভাবে আপডেট হবে।
adapter = new YourAdapter(getActivity().getApplicationContext());
adapter.setObjectsPerPage(15);
adapter.setPaginationEnabled(true);
yourList.setAdapter(adapter);
শেষ আইটেমটি সম্পূর্ণরূপে দৃশ্যমান কিনা তা সনাক্ত করতে আপনি ভিউয়ের সর্বশেষ দৃশ্যমান আইটেমের নীচে গণনা যোগ করতে পারেন lastItem.getBottom()
।
yourListView.setOnScrollListener(this);
@Override
public void onScroll(AbsListView view, final int firstVisibleItem,
final int visibleItemCount, final int totalItemCount) {
int vH = view.getHeight();
int topPos = view.getChildAt(0).getTop();
int bottomPos = view.getChildAt(visibleItemCount - 1).getBottom();
switch(view.getId()) {
case R.id.your_list_view_id:
if(firstVisibleItem == 0 && topPos == 0) {
//TODO things to do when the list view scroll to the top
}
if(firstVisibleItem + visibleItemCount == totalItemCount
&& vH >= bottomPos) {
//TODO things to do when the list view scroll to the bottom
}
break;
}
}
আমি সঙ্গে গিয়েছিলাম:
@Override
public void onScroll(AbsListView listView, int firstVisibleItem, int visibleItemCount, int totalItemCount)
{
if(totalItemCount - 1 == favoriteContactsListView.getLastVisiblePosition())
{
int pos = totalItemCount - favoriteContactsListView.getFirstVisiblePosition() - 1;
View last_item = favoriteContactsListView.getChildAt(pos);
//do stuff
}
}
পদ্ধতিতে getView()
(একটি- BaseAdapter
শ্রেণীবদ্ধ শ্রেণীর) বর্তমান চাক্ষুষের অবস্থানটি আইটেমের তালিকার সমান কিনা তা পরীক্ষা করতে পারে Adapter
। যদি এটি হয় তবে এর অর্থ আমরা তালিকার শেষে / নীচে পৌঁছে গেছি:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// ...
// detect if the adapter (of the ListView/GridView) has reached the end
if (position == getCount() - 1) {
// ... end of list reached
}
}
তালিকার নীচের দিকে শেষের দিকে স্ক্রোল শনাক্ত করার জন্য আমি আরও ভাল উপায় খুঁজে পেয়েছি, প্রথমে একটি তালিকাভিউতে স্ক্রোলিংয়ের শেষটি সনাক্ত করতে অনস্ক্রোললিস্টারের এই
বাস্তবায়ন দ্বারা স্কোল এন্ডটি সনাক্ত করুন
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
}
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.currentScrollState = scrollState;
this.isScrollCompleted();
}
private void isScrollCompleted() {
if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
/*** In this way I detect if there's been a scroll which has completed ***/
/*** do the work! ***/
}
}
অবশেষে মার্তিজানের উত্তর একত্রিত করুন
OnScrollListener onScrollListener_listview = new OnScrollListener() {
private int currentScrollState;
private int currentVisibleItemCount;
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
// TODO Auto-generated method stub
this.currentScrollState = scrollState;
this.isScrollCompleted();
}
@Override
public void onScroll(AbsListView lw, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
// TODO Auto-generated method stub
this.currentVisibleItemCount = visibleItemCount;
}
private void isScrollCompleted() {
if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
/*** In this way I detect if there's been a scroll which has completed ***/
/*** do the work! ***/
if (listview.getLastVisiblePosition() == listview.getAdapter().getCount() - 1
&& listview.getChildAt(listview.getChildCount() - 1).getBottom() <= listview.getHeight()) {
// It is scrolled all the way down here
Log.d("henrytest", "hit bottom");
}
}
}
};
স্ট্যাকওভারফ্লোতে পোস্টারগুলিকে অনেক ধন্যবাদ! আমি ক্রিয়াকলাপ এবং টুকরাগুলির জন্য কিছু ধারণাগুলি তৈরি করেছি এবং শ্রেণি শ্রোতার তৈরি করেছি (সুতরাং এই কোডটি আরও পুনঃব্যবহারযোগ্য কোডিং দ্রুততর এবং বেশি ক্লিনার তৈরি করার কোড)।
আপনি যখন আমার ক্লাসটি পেয়েছেন তখন আপনাকে যা করতে হবে তা হ'ল আমার ক্লাসে ঘোষিত ইন্টারফেসটি প্রয়োগ করা (এবং অবশ্যই এটির জন্য পদ্ধতি তৈরি করা) এবং এই শ্রেণিটি পাস করার যুক্তিগুলির অবজেক্ট তৈরি করা।
/**
* Listener for getting call when ListView gets scrolled to bottom
*/
public class ListViewScrolledToBottomListener implements AbsListView.OnScrollListener {
ListViewScrolledToBottomCallback scrolledToBottomCallback;
private int currentFirstVisibleItem;
private int currentVisibleItemCount;
private int totalItemCount;
private int currentScrollState;
public interface ListViewScrolledToBottomCallback {
public void onScrolledToBottom();
}
public ListViewScrolledToBottomListener(Fragment fragment, ListView listView) {
try {
scrolledToBottomCallback = (ListViewScrolledToBottomCallback) fragment;
listView.setOnScrollListener(this);
} catch (ClassCastException e) {
throw new ClassCastException(fragment.toString()
+ " must implement ListViewScrolledToBottomCallback");
}
}
public ListViewScrolledToBottomListener(Activity activity, ListView listView) {
try {
scrolledToBottomCallback = (ListViewScrolledToBottomCallback) activity;
listView.setOnScrollListener(this);
} catch (ClassCastException e) {
throw new ClassCastException(activity.toString()
+ " must implement ListViewScrolledToBottomCallback");
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
this.currentFirstVisibleItem = firstVisibleItem;
this.currentVisibleItemCount = visibleItemCount;
this.totalItemCount = totalItemCount;
}
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
this.currentScrollState = scrollState;
if (isScrollCompleted()) {
if (isScrolledToBottom()) {
scrolledToBottomCallback.onScrolledToBottom();
}
}
}
private boolean isScrollCompleted() {
if (this.currentVisibleItemCount > 0 && this.currentScrollState == SCROLL_STATE_IDLE) {
return true;
} else {
return false;
}
}
private boolean isScrolledToBottom() {
System.out.println("First:" + currentFirstVisibleItem);
System.out.println("Current count:" + currentVisibleItemCount);
System.out.println("Total count:" + totalItemCount);
int lastItem = currentFirstVisibleItem + currentVisibleItemCount;
if (lastItem == totalItemCount) {
return true;
} else {
return false;
}
}
}
আপনাকে আপনার তালিকার সাথে একটি খালি এক্সএমএল ফুটার রিসোর্স যুক্ত করতে হবে এবং এই পাদলেখটি দৃশ্যমান কিনা তা সনাক্ত করতে হবে।
private View listViewFooter;
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_newsfeed, container, false);
listView = (CardListView) rootView.findViewById(R.id.newsfeed_list);
footer = inflater.inflate(R.layout.newsfeed_listview_footer, null);
listView.addFooterView(footer);
return rootView;
}
তারপরে আপনার তালিকায় দেখুন স্ক্রোল শ্রোতাদের আপনি এটি করেন
@
Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
if (firstVisibleItem == 0) {
mSwipyRefreshLayout.setDirection(SwipyRefreshLayoutDirection.TOP);
mSwipyRefreshLayout.setEnabled(true);
} else if (firstVisibleItem + visibleItemCount == totalItemCount) //If last row is visible. In this case, the last row is the footer.
{
if (footer != null) //footer is a variable referencing the footer view of the ListView. You need to initialize this onCreate
{
if (listView.getHeight() == footer.getBottom()) { //Check if the whole footer is visible.
mSwipyRefreshLayout.setDirection(SwipyRefreshLayoutDirection.BOTTOM);
mSwipyRefreshLayout.setEnabled(true);
}
}
} else
mSwipyRefreshLayout.setEnabled(false);
}
আপনি যদি তালিকার শেষ আইটেমের ভিউতে একটি ট্যাগ সেট করেন, পরে আপনি ট্যাগটি দিয়ে ভিউটি পুনরুদ্ধার করতে পারেন, যদি ভিউটি শূন্য থাকে তবে ভিউটি আর লোড হয় না। এটার মত:
private class YourAdapter extends CursorAdapter {
public void bindView(View view, Context context, Cursor cursor) {
if (cursor.isLast()) {
viewInYourList.setTag("last");
}
else{
viewInYourList.setTag("notLast");
}
}
}
তবে আপনার যদি শেষ আইটেমটি লোড হয়েছে কিনা তা জানতে হবে
View last = yourListView.findViewWithTag("last");
if (last != null) {
// do what you want to do
}
Janwilx72 সঠিক, তবে এটির মিনিট SDK 21, তাই আমি এই পদ্ধতিটি তৈরি করি :
private boolean canScrollList(@ScrollOrientation int direction, AbsListView listView) {
final int childCount = listView.getChildCount();
if (childCount == 0) {
return false;
}
final int firstPos = listView.getFirstVisiblePosition();
final int paddingBottom = listView.getListPaddingBottom();
final int paddingTop = listView.getListPaddingTop();
if (direction > 0) {
final int lastBottom = listView.getChildAt(childCount - 1).getBottom();
final int lastPos = firstPos + childCount;
return lastPos < listView.getChildCount() || lastBottom > listView.getHeight() - paddingBottom;
} else {
final int firstTop = listView.getChildAt(0).getTop();
return firstPos > 0 || firstTop < paddingTop;
}
}
স্ক্রোল ওরিয়েন্টেশনের জন্য:
protected static final int SCROLL_UP = -1;
protected static final int SCROLL_DOWN = 1;
@Retention(RetentionPolicy.SOURCE)
@IntDef({SCROLL_UP, SCROLL_DOWN})
protected @interface Scroll_Orientation{}
হয়তো দেরীতে, কেবল লেটকমারদের জন্য。
আপনি যদি নিজের লিস্টভিউয়ের সাথে কাস্টম অ্যাডাপ্টার ব্যবহার করেন (বেশিরভাগ লোকেরা করেন!) একটি সুন্দর সমাধান এখানে দেওয়া হল!
https://stackoverflow.com/a/55350409/1845404
তালিকাটি শেষ আইটেমটিতে স্ক্রোল করা হলে অ্যাডাপ্টারের গেটভিউ পদ্ধতি সনাক্ত করে। এটি বিরল সময়ের জন্য সংশোধনও যুক্ত করে যখন অ্যাডাপ্টার ইতিমধ্যে শেষের দৃশ্যটি রেন্ডার করার পরেও কিছু পূর্ববর্তী অবস্থান বলা হয়।
আমি এটি করেছি এবং আমার পক্ষে কাজ করে:
private void YourListView_Scrolled(object sender, ScrolledEventArgs e)
{
double itemheight = YourListView.RowHeight;
double fullHeight = YourListView.Count * itemheight;
double ViewHeight = YourListView.Height;
if ((fullHeight - e.ScrollY) < ViewHeight )
{
DisplayAlert("Reached", "We got to the end", "OK");
}
}
এটি আপনার তালিকাটি শেষ এন্ট্রি পর্যন্ত স্ক্রোল করবে।
ListView listView = new ListView(this);
listView.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));
listView.setTranscriptMode(ListView.TRANSCRIPT_MODE_ALWAYS_SCROLL);
listView.setStackFromBottom(true);