gpt4 book ai didi

android - 使用字母分隔符android创建 ListView -如何?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:12:14 26 4
gpt4 key购买 nike

我有以下代码。我需要在 A 元素、B 等元素之前创建列表分隔符。我需要这样的东西:A Ana Al...B Bob Bill...C Cane Cod...Z Zane。如何改进我的代码?需要一些帮助。我是 android 的新手,我真的不知道如何解决这个问题。

ma​​in.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
android:id="@+id/myListView"
android:fastScrollEnabled="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fadeScrollbars="true"
android:scrollbarSize="100dp"
android:scrollbarStyle="insideOverlay"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />


</RelativeLayout>

item1.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >

<ListView
android:id="@+id/myListView"
android:fastScrollEnabled="true"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:fadeScrollbars="true"
android:scrollbarSize="100dp"
android:scrollbarStyle="insideOverlay"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />

<TextView
android:id="@+id/textSeparator"
android:layout_height="wrap_content"
android:gravity="center"
android:text="text"
android:visibility="visible"
android:layout_width="fill_parent"
android:textColor="#FFFFFFFF"
android:background="#FFFF0000" />

</RelativeLayout>

.java

package scroll.packet;


import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
import java.util.Set;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.util.Log;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SectionIndexer;

public class FastScrollActivity extends Activity {
ListView myListView;
ArrayList<String> elements;

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

// elements
String s = "QWERTZUIOPASDFGHJKLYXCVBNM";
Random r = new Random();
elements = new ArrayList<String>();
for (int i = 0; i < 300; i++) {

elements.add(s.substring(r.nextInt(s.length())));

}
Collections.sort(elements); // Must be sorted!

// listview
myListView = (ListView) findViewById(R.id.myListView);
myListView.setFastScrollEnabled(true);


//myListView.
MyIndexerAdapter<String> adapter = new MyIndexerAdapter<String>(
getApplicationContext(), android.R.layout.simple_list_item_1,
elements);
myListView.setAdapter(adapter);

// if (myListView.getFirstVisiblePosition() > adapter.getItemId( adapter.getCount()) || myListView.getLastVisiblePosition() <= adapter.getCount()) {
// myListView.smoothScrollToPosition( adapter.getCount());}

}

更新代码

    class MyIndexerAdapter<T> extends ArrayAdapter<T> implements SectionIndexer {

ArrayList<String> myElements;
HashMap<String, Integer> alphaIndexer;
private static final int TYPE_ITEM = 0;
private static final int TYPE_SEPARATOR = 1;
private static final int TYPE_MAX_COUNT = TYPE_SEPARATOR + 1;
TreeSet mSeparatorsSet = new TreeSet();
String[] sections;
LayoutInflater mInflater;

public MyIndexerAdapter(Context context, int textViewResourceId,
List<T> objects) {


super(context, textViewResourceId, objects);
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
myElements = (ArrayList<String>) objects;
// here is the tricky stuff
alphaIndexer = new HashMap<String, Integer>();
// in this hashmap we will store here the positions for
// the sections

int size = elements.size();
for (int i = size - 1; i >= 0; i--) {
String element = elements.get(i);
alphaIndexer.put(element.substring(0, 1), i);
//We store the first letter of the word, and its index.
//The Hashmap will replace the value for identical keys are putted in
}

// now we have an hashmap containing for each first-letter
// sections(key), the index(value) in where this sections begins

// we have now to build the sections(letters to be displayed)
// array .it must contains the keys, and must (I do so...) be
// ordered alphabetically

Set<String> keys = alphaIndexer.keySet(); // set of letters ...sets
// cannot be sorted...

Iterator<String> it = keys.iterator();
ArrayList<String> keyList = new ArrayList<String>(); // list can be
// sorted

while (it.hasNext()) {
String key = it.next();
keyList.add(key);
}

Collections.sort(keyList);

sections = new String[keyList.size()]; // simple conversion to an
// array of object
keyList.toArray(sections);

// ooOO00K !

}

public int getItemViewType(int position)
{
return mSeparatorsSet.contains(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}

public int getViewTypeCount()
{
return TYPE_MAX_COUNT;
}

public int getPositionForSection(int section) {
// Log.v("getPositionForSection", ""+section);
String letter = sections[section];

return alphaIndexer.get(letter);
}

public int getSectionForPosition(int position) {

// you will notice it will be never called (right?)
Log.v("getSectionForPosition", "called");
getSections();
return 0;
}

public Object[] getSections() {

return sections; // to string will be called each object, to display
// the letter
}
public void onListItemClick(ListView parent,View v, int position, long id)
{

Toast.makeText(getContext(), "you have selected" + elements.get(position), Toast.LENGTH_SHORT).show();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
int type = getItemViewType(position);
System.out.println("getView " + position + " " + convertView + " type = " + type);
if (convertView == null) {
holder = new ViewHolder();
switch (type) {
case TYPE_ITEM:
convertView = mInflater.inflate(R.layout.main, null);
holder.textView = (TextView)convertView.findViewById(R.id.text);
//break;
case TYPE_SEPARATOR:
convertView = mInflater.inflate(R.layout.item1, null);
holder.textView = (TextView)convertView.findViewById(R.id.textSeparator);
break;
}
convertView.setTag(holder);
} else {
holder = (ViewHolder)convertView.getTag();
}
holder.textView.setText(elements.get(position));
return convertView;
}

}

public void quickScroll(View v) {
String alphabet = (String)v.getTag();
int index = 0;
//find the index of the separator row view
list.setSelectionFromTop(index, 0);
}


public static class ViewHolder {
public TextView textView;
}
}

最佳答案

在您的适配器中,您必须覆盖 getViewTypeCountgetViewType

后者将获取将由 getView 创建的 View 类型(在您的情况下, View 仅包含起始字母和包含名称的 View ),前者将返回将要创建的 View 类型的数量由 getView()

创建

关于android - 使用字母分隔符android创建 ListView -如何?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9988626/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com