我正在开发一个android项目,它有一个列表视图,频道号为000到1000.我需要在listview.i中显示一个侧索引器,用0到9实现了这个,但我希望显示侧索引器如0,80,160,240,320等。我不知道如何自定义mycode。我也发布了我的代码..
public class SideIndexerActivity extends Activity
{
private GestureDetector mGestureDetector;
// x and y coordinates within our side index
private static float sideIndexX;
private static float sideIndexY;
// height of side index
private int sideIndexHeight;
// number of items in the side index
private int indexListSize;
// list with items for side index
private ArrayList<Object[]> indexList = null;
static String[] NUMBERS = new String[] { "000","001","002","003","004","005","006","007","008","009","010",
"011","012","013","014","015","016","017","018","019","020","021",
"022","023","024","025","026","027","028","029","030","100","101",
"102","104","103","104","105","106","107","108","109","110","200","201",
"202","203","204","204","205","206","207","208","209","210","300","301","302","303","304",
"304","305","306","407","408","509","610","600","701","702","803","903",
"804","805","906","907","708","809","1000","8000"};
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// don't forget to sort our array (in case it's not sorted)
Arrays.sort(NUMBERS);
final ListView lv1 = (ListView) findViewById(R.id.ListView01);
lv1.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, NUMBERS));
mGestureDetector = new GestureDetector(this, new SideIndexGestureListener());
}
@Override
public boolean onTouchEvent(MotionEvent event)
{
if (mGestureDetector.onTouchEvent(event))
{
return true;
} else
{
return false;
}
}
private ArrayList<Object[]> createIndex(String[] strArr)
{
ArrayList<Object[]> tmpIndexList = new ArrayList<Object[]>();
Object[] tmpIndexItem = null;
int tmpPos = 0;
String tmpLetter = "";
String currentLetter = null;
String strItem = null;
for (int j = 0; j < strArr.length; j++)
{
strItem = strArr[j];
currentLetter = strItem.substring(0, 1);
// every time new letters comes
// save it to index list
if (!currentLetter.equals(tmpLetter))
{
tmpIndexItem = new Object[3];
tmpIndexItem[0] = tmpLetter;
tmpIndexItem[1] = tmpPos - 1;
tmpIndexItem[2] = j - 1;
tmpLetter = currentLetter;
tmpPos = j + 1;
tmpIndexList.add(tmpIndexItem);
}
}
// save also last letter
tmpIndexItem = new Object[3];
tmpIndexItem[0] = tmpLetter;
tmpIndexItem[1] = tmpPos - 1;
tmpIndexItem[2] = strArr.length - 1;
tmpIndexList.add(tmpIndexItem);
// and remove first temporary empty entry
if (tmpIndexList != null && tmpIndexList.size() > 0)
{
tmpIndexList.remove(0);
}
return tmpIndexList;
}
@Override
public void onWindowFocusChanged(boolean hasFocus)
{
super.onWindowFocusChanged(hasFocus);
final ListView listView = (ListView) findViewById(R.id.ListView01);
LinearLayout sideIndex = (LinearLayout) findViewById(R.id.sideIndex);
sideIndexHeight = sideIndex.getHeight();
sideIndex.removeAllViews();
// TextView for every visible item
TextView tmpTV = null;
// we'll create the index list
indexList = createIndex(NUMBERS );
// number of items in the index List
indexListSize = indexList.size();
// maximal number of item, which could be displayed
int indexMaxSize = (int) Math.floor(sideIndex.getHeight() / 20);
int tmpIndexListSize = indexListSize;
// handling that case when indexListSize > indexMaxSize
while (tmpIndexListSize > indexMaxSize)
{
tmpIndexListSize = tmpIndexListSize / 2;
}
// computing delta (only a part of items will be displayed to save a
// place)
double delta = indexListSize / tmpIndexListSize;
String tmpLetter = null;
Object[] tmpIndexItem = null;
// show every m-th letter
for (double i = 1; i <= indexListSize; i = i+ delta)
{
tmpIndexItem = indexList.get((int) i - 1);
tmpLetter = tmpIndexItem[0].toString();
tmpTV = new TextView(this);
tmpTV.setText(tmpLetter);
tmpTV.setGravity(Gravity.CENTER);
tmpTV.setTextSize(20);
LayoutParams params = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT, 1);
tmpTV.setLayoutParams(params);
sideIndex.addView(tmpTV);
}
// and set a touch listener for it
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;
}
});
}
class SideIndexGestureListener extends
GestureDetector.SimpleOnGestureListener
{
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2,
float distanceX, float distanceY)
{
// we know already coordinates of first touch
// we know as well a scroll distance
sideIndexX = sideIndexX - distanceX;
sideIndexY = sideIndexY - distanceY;
// when the user scrolls within our side index
// we can show for every position in it a proper
// item in the country list
if (sideIndexX >= 0 && sideIndexY >= 0)
{
displayListItem();
}
return super.onScroll(e1, e2, distanceX, distanceY);
}
}
public void displayListItem()
{
// 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);
// compute minimal position for the item in the list
int minPosition = (int) (itemPosition * pixelPerIndexItem);
// get the item (we can do it since we know item index)
Object[] indexItem = indexList.get(itemPosition);
// and compute the proper item in the country list
int indexMin = Integer.parseInt(indexItem[1].toString());
int indexMax = Integer.parseInt(indexItem[2].toString());
int indexDelta = Math.max(1, indexMax - indexMin);
double pixelPerSubitem = pixelPerIndexItem / indexDelta;
int subitemPosition = (int) (indexMin + (sideIndexY - minPosition) / pixelPerSubitem);
ListView listView = (ListView) findViewById(R.id.ListView01);
listView.setSelection(subitemPosition);
}
}
请帮助我一些想法。
现在我的列表视图显示为侧索引
0 1 2 3 4 五 6 7 8 9
但我想要 0 80 160 240 320 400 480 640 720 800 880
请帮助..
答案 0 :(得分:1)
更改
currentLetter = strItem.substring(0, 1);
到
currentLetter = strItem.substring(0, 3);
答案 1 :(得分:0)
我没有看到您的代码在您要查找的输出的任何位置都能正常工作。
您能准确地告诉您的问题以及与之相关的代码吗?
你在[]中添加的数字是“001,002 ......你想要结果为0,80,......”我的意思是我没有看到任何计算或选择依赖于你的代码需求。