Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在ListView中创建简单的字母滚动?_Android_Listview_Android Layout - Fatal编程技术网

Android 在ListView中创建简单的字母滚动?

Android 在ListView中创建简单的字母滚动?,android,listview,android-layout,Android,Listview,Android Layout,我希望模仿最新音乐应用程序中的功能,即弹出的漂亮的小光标,它可以让人超快速滚动到他们正在寻找的艺术家/专辑/曲目: 是否有一种方法可以在Android SDK的列表视图中启用类似的功能?实现列表适配器。这款音乐应用程序还利用手机来完成一些繁重的工作。还可以在实际的列表视图上使用setFastScrollEnabled(true)来启用此功能 编辑:如果未使用游标适配器,则无法使用字母索引器。您可以尝试查看该实现,看看将其调整为与ArrayAdapter一起工作有多困难。setFastScro

我希望模仿最新音乐应用程序中的功能,即弹出的漂亮的小光标,它可以让人超快速滚动到他们正在寻找的艺术家/专辑/曲目:


是否有一种方法可以在Android SDK的
列表视图中启用类似的功能?

实现列表适配器。这款音乐应用程序还利用手机来完成一些繁重的工作。还可以在实际的
列表视图上使用
setFastScrollEnabled(true)
来启用此功能

编辑:如果未使用游标适配器,则无法使用字母索引器。您可以尝试查看该实现,看看将其调整为与ArrayAdapter一起工作有多困难。

setFastScrollEnabled(true)


()

在anddev.org上我找到了这个教程:

它还包含一个简短的


希望有帮助

要收集列表视图中显示的项目的详细信息,可以执行以下操作:

@Override
        public void onScroll(AbsListView view, int firstVisibleItem,
                int visibleItemCount, int totalItemCount) {

            albumButton.setText(songs.get(firstVisibleItem).getAlbum());

        }
这不是简单一点吗?这里,“歌曲”是歌曲对象的数组列表。您甚至可以通过添加firstVisibleItem+visibleItemCount来获取最后一个可见项。我发现这项技术非常有用。这样你就可以得到每首歌的第一个字母。我假设你发布的音乐应用程序中包含字母的灰色框是一个类似的对话框


不管怎样,希望这有帮助。我意识到我迟到了,但这是为未来的人们准备的

这是我正在使用的ArrayAdapter的子类。请注意,我传入的
对象
已按字母顺序排序,使用
Collections.sort(objects)

class SectionIndexingArrayAdapter扩展了ArrayAdapter实现
分段索引器{
HashMap sectionsMap=新的HashMap();
ArrayList sectionsList=新的ArrayList();
ArrayList sectionForPosition=新的ArrayList();
ArrayList positionForSection=新建ArrayList();
公共部分IndexingArrayAdapter(上下文,int textViewResourceId,
列出对象){
超级(上下文、textViewResourceId、对象);
//请注意,列表对象已按字母顺序排序
//例如,使用集合。排序(对象)**在**传递给
//这个构造函数。
//弄清楚这些部分应该是什么(每个部分一个)
//首字母,以容纳可能丢失的字母,
//或者像这样的角色)
对于(int i=0;i0){
String firstLetter=objectString.substring(0,1.toUpperCase();
如果(!sectionsMap.containsKey(第一个字母)){
sectionsMap.put(第一个字母,sectionsMap.size());
章节列表添加(第一个字母);
}
}
}
//计算列表中每个位置的截面。
对于(int i=0;i0){
String firstLetter=objectString.substring(0,1.toUpperCase();
如果(第四节,包括第一个字母){
sectionForPosition.add(sectionsMap.get(第一个字母));
}否则
位置部分。添加(0);
}否则
位置部分。添加(0);
}
//计算每个部分开始的第一个位置。
对于(int i=0;i
我找到了一个很好的解决方案。。。非常适用于大量列表。。。又快又好。。。没有加载时间

@Override
public int getPositionForSection(int section)
{
    log.info("Get position for section");

    for (int i = 0; i < this.getCount(); i++)
    {
        if (this.getItem(i).length() > 0)
        {
            String item = this.getItem(i).toUpperCase();
            if (item.charAt(0) == sections.charAt(section))
            {
                return i;
            }
        }
    }
    return 0;
}

@Override
public int getSectionForPosition(int arg0)
{
    log.info("Get section");

    return 0;
}

@Override
public Object[] getSections()
{
    log.info("Get sections");

    String[] sectionsArr = new String[sections.length()];

    for (int i = 0; i < sections.length(); i++)
    {
        sectionsArr[i] = "" + sections.charAt(i);
    }
    return sectionsArr;
}
@覆盖
公共int getPositionForSection(int段)
{
日志信息(“获取区段位置”);
for(int i=0;i0)
{
String item=this.getItem(i).toUpperCase();
如果(项目字符(0)=部分字符(部分))
{
返回i;
}
}
}
返回0;
}
@凌驾
public int getSectionForPosition(int arg0)
{
日志信息(“获取部分”);
返回0;
}
@凌驾
公共对象[]getSections()
{
log.info(“获取部分”);
String[]sectionsArr=新字符串[sections.length()];
对于(int i=0;i
好的,很好,但是如何实现
节索引器
?由于我的列表适配器是一个
阵列适配器
,如何获取光标以将其传递到
字母索引器
?我有相当简单的数据,我只需要按名称的字母顺序分组,因此希望使用
字母索引器
。非常好,谢谢,我将研究在我的适配器中实现
SectionIndexer
接口并提供我的节。示例代码:请查看请注意此错误:我正在做类似的事情此方法非常有效!!!我唯一的问题是我有一个非常长的列表。。。而且要花很长时间才能得到所有的标题。。。等我尝试在异步任务中运行这些for循环。。。但它只是冻结了一切。。。暗示
@Override
public int getPositionForSection(int section)
{
    log.info("Get position for section");

    for (int i = 0; i < this.getCount(); i++)
    {
        if (this.getItem(i).length() > 0)
        {
            String item = this.getItem(i).toUpperCase();
            if (item.charAt(0) == sections.charAt(section))
            {
                return i;
            }
        }
    }
    return 0;
}

@Override
public int getSectionForPosition(int arg0)
{
    log.info("Get section");

    return 0;
}

@Override
public Object[] getSections()
{
    log.info("Get sections");

    String[] sectionsArr = new String[sections.length()];

    for (int i = 0; i < sections.length(); i++)
    {
        sectionsArr[i] = "" + sections.charAt(i);
    }
    return sectionsArr;
}