Create a Project named as Alphabetical Scroll
Step 2:
Copy Below code in to main activity
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Locale;
import java.util.regex.Pattern;
import uk.co.brightec.alphabetscroller.AlphabetListAdapter.Item;
import uk.co.brightec.alphabetscroller.AlphabetListAdapter.Row;
import uk.co.brightec.alphabetscroller.AlphabetListAdapter.Section;
import android.app.ListActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.GestureDetector;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.view.ViewGroup;
import android.widget.LinearLayout;
import android.widget.TextView;
public class MainActivity extends ListActivity {
private AlphabetListAdapter adapter = new AlphabetListAdapter();
private GestureDetector mGestureDetector;
private List < Object[] > alphabet = new ArrayList < Object[] > ();
private HashMap < String, Integer > sections = new HashMap < String, Integer > ();
private int sideIndexHeight;
private static float sideIndexX;
private static float sideIndexY;
private int indexListSize;
class SideIndexGestureListener extends GestureDetector.SimpleOnGestureListener {@
Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
sideIndexX = sideIndexX - distanceX;
sideIndexY = sideIndexY - distanceY;
if (sideIndexX >= 0 && sideIndexY >= 0) {
displayListItem();
}
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
@
Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.list_alphabet);
mGestureDetector = new GestureDetector(this, new SideIndexGestureListener());
List < String > countries = populateCountries();
Collections.sort(countries);
List < Row > rows = new ArrayList < Row > ();
int start = 0;
int end = 0;
String previousLetter = null;
Object[] tmpIndexItem = null;
Pattern numberPattern = Pattern.compile("[0-9]");
for (String country: countries) {
String firstLetter = country.substring(0, 1);
// Group numbers together in the scroller
if (numberPattern.matcher(firstLetter).matches()) {
firstLetter = "#";
}
// If we've changed to a new letter, add the previous letter to the alphabet scroller
if (previousLetter != null && !firstLetter.equals(previousLetter)) {
end = rows.size() - 1;
tmpIndexItem = new Object[3];
tmpIndexItem[0] = previousLetter.toUpperCase(Locale.UK);
tmpIndexItem[1] = start;
tmpIndexItem[2] = end;
alphabet.add(tmpIndexItem);
start = end + 1;
}
// Check if we need to add a header row
if (!firstLetter.equals(previousLetter)) {
rows.add(new Section(firstLetter));
sections.put(firstLetter, start);
}
// Add the country to the list
rows.add(new Item(country));
previousLetter = firstLetter;
}
if (previousLetter != null) {
// Save the last letter
tmpIndexItem = new Object[3];
tmpIndexItem[0] = previousLetter.toUpperCase(Locale.UK);
tmpIndexItem[1] = start;
tmpIndexItem[2] = rows.size() - 1;
alphabet.add(tmpIndexItem);
}
adapter.setRows(rows);
setListAdapter(adapter);
updateList();
}
@
Override
public boolean onTouchEvent(MotionEvent event) {
if (mGestureDetector.onTouchEvent(event)) {
return true;
} else {
return false;
}
}
public void updateList() {
LinearLayout sideIndex = (LinearLayout) findViewById(R.id.sideIndex);
sideIndex.removeAllViews();
indexListSize = alphabet.size();
if (indexListSize < 1) {
return;
}
int indexMaxSize = (int) Math.floor(sideIndex.getHeight() / 20);
int tmpIndexListSize = indexListSize;
while (tmpIndexListSize > indexMaxSize) {
tmpIndexListSize = tmpIndexListSize / 2;
}
double delta;
if (tmpIndexListSize > 0) {
delta = indexListSize / tmpIndexListSize;
} else {
delta = 1;
}
TextView tmpTV;
for (double i = 1; i <= indexListSize; i = i + delta) {
Object[] tmpIndexItem = alphabet.get((int) i - 1);
String tmpLetter = tmpIndexItem[0].toString();
tmpTV = new TextView(this);
tmpTV.setText(tmpLetter);
tmpTV.setGravity(Gravity.CENTER);
tmpTV.setTextSize(15);
LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1);
tmpTV.setLayoutParams(params);
sideIndex.addView(tmpTV);
}
sideIndexHeight = sideIndex.getHeight();
sideIndex.setOnTouchListener(new OnTouchListener() {@
Override
public boolean onTouch(View v, MotionEvent event) {
// now you know coordinates of touch
sideIndexX = event.getX();
sideIndexY = event.getY();
// and can display a proper item it country list
displayListItem();
return false;
}
});
}
public void displayListItem() {
LinearLayout sideIndex = (LinearLayout) findViewById(R.id.sideIndex);
sideIndexHeight = sideIndex.getHeight();
// compute number of pixels for every side index item
double pixelPerIndexItem = (double) sideIndexHeight / indexListSize;
// compute the item index for given event position belongs to
int itemPosition = (int)(sideIndexY / pixelPerIndexItem);
// get the item (we can do it since we know item index)
if (itemPosition < alphabet.size()) {
Object[] indexItem = alphabet.get(itemPosition);
int subitemPosition = sections.get(indexItem[0]);
//ListView listView = (ListView) findViewById(android.R.id.list);
getListView().setSelection(subitemPosition);
}
}
private List < String > populateCountries() {
List < String > countries = new ArrayList < String > ();
countries.add("Afghanistan");
countries.add("Albania");
countries.add("Bahrain");
countries.add("Bangladesh");
countries.add("Cambodia");
countries.add("Cameroon");
countries.add("Denmark");
countries.add("Djibouti");
countries.add("East Timor");
countries.add("Ecuador");
countries.add("Fiji");
countries.add("Finland");
countries.add("Gabon");
countries.add("Georgia");
countries.add("Haiti");
countries.add("Holy See");
countries.add("Iceland");
countries.add("India");
countries.add("Jamaica");
countries.add("Japan");
countries.add("Kazakhstan");
countries.add("Kenya");
countries.add("Laos");
countries.add("Latvia");
countries.add("Macau");
countries.add("Macedonia");
countries.add("Namibia");
countries.add("Nauru");
countries.add("Oman");
countries.add("Pakistan");
countries.add("Palau");
countries.add("Qatar");
countries.add("Romania");
countries.add("Russia");
countries.add("Saint Kitts and Nevis");
countries.add("Saint Lucia");
countries.add("Taiwan");
countries.add("Tajikistan");
countries.add("Uganda");
countries.add("Ukraine");
countries.add("Vanuatu");
countries.add("Venezuela");
countries.add("Yemen");
countries.add("Zambia");
countries.add("Zimbabwe");
countries.add("0");
countries.add("2");
countries.add("9");
return countries;
}
}
Step 2: Create a class named as AlphabetListAdapter paste below code into it
import java.util.List;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;
import android.widget.TextView;
public class AlphabetListAdapter extends BaseAdapter {
public static abstract class Row {}
public static final class Section extends Row {
public final String text;
public Section(String text) {
this.text = text;
}
}
public static final class Item extends Row {
public final String text;
public Item(String text) {
this.text = text;
}
}
private List < Row > rows;
public void setRows(List < Row > rows) {
this.rows = rows;
}
@Override
public int getCount() {
return rows.size();
}
@Override
public Row getItem(int position) {
return rows.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return 2;
}
@Override
public int getItemViewType(int position) {
if (getItem(position) instanceof Section) {
return 1;
} else {
return 0;
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
if (getItemViewType(position) == 0) { // Item
if (view == null) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (LinearLayout) inflater.inflate(R.layout.row_item, parent, false);
}
Item item = (Item) getItem(position);
TextView textView = (TextView) view.findViewById(R.id.textView1);
textView.setText(item.text);
} else { // Section
if (view == null) {
LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = (LinearLayout) inflater.inflate(R.layout.row_section, parent, false);
}
Section section = (Section) getItem(position);
TextView textView = (TextView) view.findViewById(R.id.textView1);
textView.setText(section.text);
}
return view;
}
}
Step 3: paste following code into activity_main.xml\
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<ListView
android:id="@android:id/list"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:fastScrollEnabled="true" />
<LinearLayout
android:id="@+id/sideIndex"
android:layout_width="40dip"
android:layout_height="fill_parent"
android:background="#FFF"
android:gravity="center_horizontal"
android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
Step 4: Create an xml file named as row item paste following code into it
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:padding="10dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/darker_gray"
android:orientation="horizontal"
android:paddingBottom="2dp"
android:paddingLeft="10dp"
android:paddingTop="2dp" >
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="TextView"
android:textColor="@android:color/white"
android:textStyle="bold" />
</LinearLayout>
Done:)

Great Tutorial
ReplyDeleteThanks alot
getListView() & setListAdapter((
ReplyDeleteshow error