Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package com.mukesh.aphabaticalview;
- import android.app.Activity;
- import android.os.Bundle;
- import android.os.Handler;
- import android.view.View;
- import android.view.ViewTreeObserver;
- import android.widget.AbsListView;
- import android.widget.AdapterView;
- import android.widget.ArrayAdapter;
- import android.widget.ListView;
- import java.lang.reflect.Field;
- import java.lang.reflect.Method;
- import java.util.ArrayList;
- import java.util.Arrays;
- public class Alphbatical extends Activity {
- private ListView countryList;
- ListView sideList;
- boolean isReady = false, mainTouched, sideTouched;
- AbsListView.OnScrollListener mainListener, sideListener, slaveListener;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.home);
- sideList = (ListView) findViewById(R.id.sideIndex);
- countryList = (ListView) findViewById(R.id.list);
- //TODO
- addGlobalLayoutListener();
- }
- private void addGlobalLayoutListener() {
- findViewById(R.id.main).getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
- @Override
- public void onGlobalLayout() {
- if (isReady)
- return;
- isReady = true;
- setEverything();
- }
- });
- }
- private void setEverything() {
- setMainListView();
- setSideListView();
- }
- //TODO
- private void stopScroll(AbsListView view) {
- try {
- Field field = android.widget.AbsListView.class.getDeclaredField("mFlingRunnable");
- field.setAccessible(true);
- Object flingRunnable = field.get(view);
- if (flingRunnable != null) {
- Method method = Class.forName("android.widget.AbsListView$FlingRunnable").getDeclaredMethod("endFling");
- method.setAccessible(true);
- method.invoke(flingRunnable);
- }
- } catch (Exception ignored) {
- }
- }
- private void setMainListView() {
- // TODO ADAPTER
- View v = new View(getApplicationContext());
- int height = countryList.getHeight();
- v.setLayoutParams(new AbsListView.LayoutParams(10, height));
- countryList.addFooterView(v, null, false);
- AllDataAdapter adapter = new AllDataAdapter(getApplicationContext(), R.layout.home_list, Whatever.getData());
- countryList.setAdapter(adapter);
- // TODO SCROLL LISTENER
- mainListener = new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView absListView, int i) {
- switch (i) {
- case SCROLL_STATE_TOUCH_SCROLL:
- mainTouched = true;
- break;
- case SCROLL_STATE_IDLE:
- mainTouched = false;
- sideList.setOnScrollListener(sideListener);
- break;
- }
- }
- @Override
- public void onScroll(AbsListView absListView, int first, int visible, int all) {
- if (first == all - 1) {
- countryList.setSelection(first - 1);
- stopScroll(countryList);
- return;
- }
- if (mainTouched) {
- String character = ((Data) (countryList.getAdapter().getItem(countryList.getFirstVisiblePosition()))).title.substring(0, 1);
- for (int i = 0; i < sideList.getAdapter().getCount(); i++) {
- if ((sideList.getAdapter().getItem(i)).equals(character)) {
- smoothScrollToPositionFromTop(sideList, i);
- break;
- }
- }
- }
- }
- };
- countryList.setOnScrollListener(mainListener);
- }
- private void setSideListView() {
- final String[] alphabaticalList = {"All", "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"};
- ArrayAdapter<String> alphabaticalListAdapter = new ArrayAdapter<String>(
- this, android.R.layout.simple_list_item_1, Arrays.asList(alphabaticalList));
- View v = new View(getApplicationContext());
- int height = sideList.getHeight();
- v.setLayoutParams(new AbsListView.LayoutParams(10, height));
- sideList.addFooterView(v, null, false);
- sideList.setAdapter(alphabaticalListAdapter);
- sideListener = new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(AbsListView absListView, int i) {
- switch (i) {
- case SCROLL_STATE_TOUCH_SCROLL:
- sideTouched = true;
- break;
- case SCROLL_STATE_IDLE:
- countryList.setOnScrollListener(mainListener);
- sideTouched = false;
- break;
- }
- }
- @Override
- public void onScroll(AbsListView absListView, int first, int visible, int all) {
- if (first == all - 1) {
- sideList.setSelection(first - 1);
- sideList.scrollBy(0, 0);
- stopScroll(sideList);
- return;
- }
- if (sideTouched) {
- String character = ((String) absListView.getAdapter().getItem(first)).substring(0, 1);
- for (int i = 0; i < countryList.getAdapter().getCount() - 1; i++) {
- if (((Data) countryList.getAdapter().getItem(i)).title.substring(0, 1).equals(character)) {
- smoothScrollToPositionFromTop(countryList, i);
- break;
- }
- }
- }
- }
- };
- sideList.setOnScrollListener(sideListener);
- }
- public void smoothScrollToPositionFromTop(final AbsListView view, final int position) {
- View child = getChildAtPosition(view, position);
- if ((child != null) && ((child.getTop() == 0) || ((child.getTop() > 0) && !view.canScrollVertically(1)))) {
- return;
- }
- if (position < view.getFirstVisiblePosition()) {
- final int value = (position - view.getFirstVisiblePosition()) * view.getAdapter().getView(view.getFirstVisiblePosition(), null, view).getHeight();
- view.smoothScrollToPosition(value);
- }
- // else {
- view.setOnScrollListener(new AbsListView.OnScrollListener() {
- @Override
- public void onScrollStateChanged(final AbsListView view, final int scrollState) {
- if (scrollState == SCROLL_STATE_IDLE) {
- view.setOnScrollListener(null);
- new Handler().post(new Runnable() {
- @Override
- public void run() {
- view.setSelection(position);
- }
- });
- }
- }
- @Override
- public void onScroll(final AbsListView view, final int firstVisibleItem, final int visibleItemCount,final int totalItemCount) {}
- });
- new Handler().post(new Runnable() {
- @Override
- public void run() {
- view.smoothScrollToPositionFromTop(position, 0);
- }
- });
- // }
- }
- public static View getChildAtPosition(final AdapterView view, final int position) {
- final int index = position - view.getFirstVisiblePosition();
- if ((index >= 0) && (index < view.getChildCount())) {
- return view.getChildAt(index);
- } else {
- return null;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement