android listview字母索引,Android ListView右侧的字母索引View

这个博客内容详细介绍了如何实现一个Android平台上的侧边栏字母选择组件。该组件能够根据给定的字母列表动态绘制并响应用户的触摸事件,显示选中字母的变化,并通过接口传递选中的字母给外部。博客涵盖了组件的初始化、绘图过程、触摸事件处理以及如何设置和更新字母列表等关键功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

letterList;

private ListletterShow;

private int choose = -1;

private Paint paint = new Paint();

private TextView mTextDialog;

public SideBar(Context context) {

this(context, null);

}

public SideBar(Context context, AttributeSet attrs) {

this(context, attrs, 0);

}

public SideBar(Context context, AttributeSet attrs, int defStyle) {

super(context, attrs, defStyle);

init();

}

private void init() {

setBackgroundColor(Color.parseColor("#00000000"));

letterList = Arrays.asList(INDEX_STRING);

letterShow = Arrays.asList(INDEX_SHOW);

}

protected void onDraw(Canvas canvas) {

super.onDraw(canvas);

int height = getHeight();// 获取对应高度

int width = getWidth();// 获取对应宽度

int singleHeight = height / letterShow.size();// 获取每一个字母的高度

for (int i = 0; i < letterShow.size(); i++) {

paint.setColor(Color.parseColor("#FFFFFF"));

paint.setTypeface(Typeface.DEFAULT_BOLD);

paint.setAntiAlias(true);

paint.setTextSize(26);

// 选中的状态

if (i == choose) {

paint.setColor(Color.parseColor("#4F41FD"));

paint.setTextSize(28);

paint.setFakeBoldText(true);

}

// x坐标等于中间-字符串宽度的一半.

float xPos = width / 2 - paint.measureText(letterShow.get(i)) / 2;

float yPos = singleHeight * i + singleHeight -2;

canvas.drawText(letterShow.get(i), xPos, yPos, paint);

paint.reset();// 重置画笔

}

}

@Override

public boolean dispatchTouchEvent(MotionEvent event) {

final int action = event.getAction();

final float y = event.getY();// 点击y坐标

final int oldChoose = choose;

final OnTouchingLetterChangedListener listener = onTouchingLetterChangedListener;

final int c = (int) (y / getHeight() * letterShow.size());// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.

switch (action) {

case MotionEvent.ACTION_UP:

setBackgroundColor(Color.parseColor("#00000000"));

choose = -1;

invalidate();

if (mTextDialog != null) {

mTextDialog.setVisibility(View.GONE);

}

break;

default:

setBackgroundColor(Color.parseColor("#00000000"));

if (oldChoose != c) {

if (c >= 0 && c < letterList.size()) {

String alertText = letterList.get(c);

if (listener != null && !"".equals(alertText)) {

listener.onTouchingLetterChanged(alertText);

}

if (mTextDialog != null && !"".equals(alertText)) {

mTextDialog.setText(alertText);

mTextDialog.setVisibility(View.VISIBLE);

}

choose = c;

invalidate();

}

}

break;

}

return true;

}

public void setIndexText(ArrayListindexStrings) {

this.letterList = indexStrings;

invalidate();

}

/**

* 为SideBar设置显示当前按下的字母的TextView

*

* @param mTextDialog

*/

public void setTextView(TextView mTextDialog) {

this.mTextDialog = mTextDialog;

}

/**

* 向外公开的方法

*

* @param onTouchingLetterChangedListener

*/

public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {

this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;

}

/**

* 接口

*/

public interface OnTouchingLetterChangedListener {

void onTouchingLetterChanged(String s);

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值