Android – ListView com índice de rolagem. (ListView with fast scroll and Index Scrolling)

fast Index Scrolling

Além da rolagem tradicional, uma lista em ordem alfabética longa também pode oferecer a rolagem de índice: uma maneira de navegar rapidamente para os itens que começam com uma determinada letra. Com a rolagem de índice, um indicador de rolagem aparece mesmo quando o usuário não está rolando. Tocando ou arrastando-o faz com que a letra atual para aparecer de forma proeminente. (Android Developer – Scrolling).

Abaixo vamos demostrar como fazer a lista mostrada na imagem acima. Vamos iniciar com o main.xml, nele vamos definir nossa Lista vejamos:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:layout_width="match_parent"
              android:layout_height="match_parent"
>
    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:fastScrollEnabled="true"
        android:fastScrollAlwaysVisible="true"
        android:cacheColorHint="@android:color/transparent"
    />
</LinearLayout>

Observações:
android:fastScrollEnabled=”true” Exibe a barra de rolagem. (ao rolar)
android:fastScrollAlwaysVisible Permite que a barra de rolagem seja sempre visível.

Agora que temos nossa Lista, vamos criar um Adapter, nele implementaremos a interface SectionIndexer responsável em mostrar os índices da rolagem.

public class IndexAdapter extends ArrayAdapter<String> implements SectionIndexer {

    private HashMap<String, Integer> indexer;
    private String[] sections;

    public IndexAdapter(Context context, List<String> items) {
        super(context, android.R.layout.simple_list_item_1, items);
        indexer = new HashMap<String, Integer>();
        int size = items.size();
        for (int index = 0; index < size; index++) {
            String item = items.get(index);
            String chave = item.substring(0, 1);
            chave = chave.toUpperCase();
            if (!indexer.containsKey(chave)) {
                indexer.put(chave, index);
            }
        }

        ArrayList<String> sectionList = new ArrayList<String>(indexer.keySet());
        Collections.sort(sectionList);

        sections = new String[sectionList.size()];
        sections = sectionList.toArray(sections);
    }

    @Override
    public int getPositionForSection(int section) {
        return indexer.get(sections[section]);
    }

    @Override
    public int getSectionForPosition(int position) {
        return 0;
    }

    @Override
    public Object[] getSections() {
        return sections;
    }
}

Com o Adapter criado basta instancia-lo, passar os valores e defini-lo no ListView.
Exemplo:

public class MainActivity extends Activity {

    static final String[] COUNTRIES = new String[]{"Afghanistan", "Albania",
        "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla",
        "Antarctica", "Antigua and Barbuda", "Argentina", "Armenia",
        "Aruba", "Australia", "Austria", "Azerbaijan", "Bahrain",
        "Bangladesh", "Barbados", "Belarus", "Belgium", "Belize", "Benin",
        "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegovina",
        "Botswana", "Bouvet Island", "Brazil",
        "British Indian Ocean Territory", "British Virgin Islands",
        "Brunei", "Bulgaria", "Burkina Faso", "Burundi", "Cote d'Ivoire",
        "Cambodia", "Cameroon", "Canada", "Cape Verde", "Cayman Islands",
        "Central African Republic", "Chad", "Chile", "China",
        "Christmas Island", "Cocos (Keeling) Islands", "Colombia",
        "Comoros", "Congo", "Cook Islands", "Costa Rica", "Croatia",
        "Cuba", "Cyprus", "Czech Republic",
        "Democratic Republic of the Congo", "Denmark", "Djibouti",
        "Dominica", "Dominican Republic", "East Timor", "Ecuador", "Egypt",
        "El Salvador", "Equatorial Guinea", "Eritrea", "Estonia",
        "Ethiopia", "Faeroe Islands", "Falkland Islands", "Fiji",
        "Finland", "Former Yugoslav Republic of Macedonia", "France",
        "French Guiana", "French Polynesia", "French Southern Territories",
        "Gabon", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece",
        "Greenland", "Grenada", "Guadeloupe", "Guam", "Guatemala",
        "Guinea", "Guinea-Bissau", "Guyana", "Haiti",
        "Heard Island and McDonald Islands", "Honduras", "Hong Kong",
        "Hungary", "Iceland", "India", "Indonesia", "Iran", "Iraq",
        "Ireland", "Israel", "Italy", "Jamaica", "Japan", "Jordan",
        "Kazakhstan", "Kenya", "Kiribati", "Kuwait", "Kyrgyzstan", "Laos",
        "Latvia", "Lebanon", "Lesotho", "Liberia", "Libya",
        "Liechtenstein", "Lithuania", "Luxembourg", "Macau", "Madagascar",
        "Malawi", "Malaysia", "Maldives", "Mali", "Malta",
        "Marshall Islands", "Martinique", "Mauritania", "Mauritius",
        "Mayotte", "Mexico", "Micronesia", "Moldova", "Monaco", "Mongolia",
        "Montserrat", "Morocco", "Mozambique", "Myanmar", "Namibia",
        "Nauru", "Nepal", "Netherlands", "Netherlands Antilles",
        "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria",
        "Niue", "Norfolk Island", "North Korea", "Northern Marianas",
        "Norway", "Oman", "Pakistan", "Palau", "Panama",
        "Papua New Guinea", "Paraguay", "Peru", "Philippines",
        "Pitcairn Islands", "Poland", "Portugal", "Puerto Rico", "Qatar",
        "Reunion", "Romania", "Russia", "Rwanda", "Sqo Tome and Principe",
        "Saint Helena", "Saint Kitts and Nevis", "Saint Lucia",
        "Saint Pierre and Miquelon", "Saint Vincent and the Grenadines",
        "Samoa", "San Marino", "Saudi Arabia", "Senegal", "Seychelles",
        "Sierra Leone", "Singapore", "Slovakia", "Slovenia",
        "Solomon Islands", "Somalia", "South Africa",
        "South Georgia and the South Sandwich Islands", "South Korea",
        "Spain", "Sri Lanka", "Sudan", "Suriname",
        "Svalbard and Jan Mayen", "Swaziland", "Sweden", "Switzerland",
        "Syria", "Taiwan", "Tajikistan", "Tanzania", "Thailand",
        "The Bahamas", "The Gambia", "Togo", "Tokelau", "Tonga",
        "Trinidad and Tobago", "Tunisia", "Turkey", "Turkmenistan",
        "Turks and Caicos Islands", "Tuvalu", "Virgin Islands", "Uganda",
        "Ukraine", "United Arab Emirates", "United Kingdom",
        "United States", "United States Minor Outlying Islands", "Uruguay",
        "Uzbekistan", "Vanuatu", "Vatican City", "Venezuela", "Vietnam",
        "Wallis and Futuna", "Western Sahara", "Yemen", "Yugoslavia",
        "Zambia", "Zimbabwe"};
    private ListView listView;
    private IndexAdapter indexAdapter;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        listView = (ListView) findViewById(R.id.list_view);
        indexAdapter = new IndexAdapter(this, Arrays.asList(COUNTRIES));

        listView.setAdapter(indexAdapter);
    }
}

Projeto em anexo: (AQUI)

Help DEV – Analista desenvolvedor Java / Android

http://helpdev.com.br/zarelli

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>