自定义字母
public class SideBar extends View {
// 触摸事件
private OnTouchingLetterChangedListener onTouchingLetterChangedListener;
// 26个字母
public static String[] A_Z = {"A", "B", "C", "D", "E", "F", "G", "H", "I",
"J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V",
"W", "X", "Y", "Z", "#"};
private int choose = -1;// 选中
private Paint paint = new Paint();
private TextView mTextDialog;
/**
* 为SideBar设置显示字母的TextView
*
* @param mTextDialog
*/
public void setTextView(TextView mTextDialog) {
this.mTextDialog = mTextDialog;
}
public SideBar(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public SideBar(Context context, AttributeSet attrs) {
super(context, attrs);
}
public SideBar(Context context) {
super(context);
}
/**
* 重写这个方法
*/
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 获取焦点改变背景颜色.
int height = getHeight();// 获取对应高度
int width = getWidth(); // 获取对应宽度
int singleHeight = height / A_Z.length - 2;// 获取每一个字母的高度 (这里-2仅仅是为了好看而已)
for (int i = 0; i < A_Z.length; i++) {
paint.setColor(Color.rgb(33, 65, 98)); //设置字体颜色
paint.setTypeface(Typeface.DEFAULT_BOLD); //设置字体
paint.setAntiAlias(true); //设置抗锯齿
paint.setTextSize(30); //设置字母字体大小
// 选中的状态
if (i == choose) {
paint.setColor(Color.parseColor("#3399ff")); //选中的字母改变颜色
paint.setFakeBoldText(true); //设置字体为粗体
}
// x坐标等于中间-字符串宽度的一半.
float xPos = width / 2 - paint.measureText(A_Z[i]) / 2;
float yPos = singleHeight * i + singleHeight;
canvas.drawText(A_Z[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() * A_Z.length);// 点击y坐标所占总高度的比例*b数组的长度就等于点击b中的个数.
switch (action) {
case MotionEvent.ACTION_UP:
setBackgroundDrawable(new ColorDrawable(0x00000000));
// choose = -1; //改变最后离开时字母的颜色
if (listener != null){
listener.onTouchUpListener();
}
Log.i("aaaaa", "dispatchTouchEvent: " + "手指离开的时候");
invalidate();
if (mTextDialog != null) {
mTextDialog.setVisibility(View.INVISIBLE);
}
break;
default:
// setBackgroundResource(R.drawable.ic_launcher_background);
if (oldChoose != c) { //判断选中字母是否发生改变
if (c >= 0 && c < A_Z.length) {
if (listener != null) {
listener.onTouchingLetterChanged(A_Z[c]);
}
if (mTextDialog != null) {
mTextDialog.setText(A_Z[c]);
mTextDialog.setVisibility(View.VISIBLE);
}
choose = c;
invalidate();
}
}
break;
}
return true;
}
/**
* 根据适配器调整SideBar选中的字母
*/
public void setScroolToSelect(String s){
for (int i = 0; i < A_Z.length; i++) {
if (s.equals( A_Z[i])){
choose = i;
invalidate();
Log.i("aaaaa", "dispatchTouchEvent: " + "触发");
return;
}
}
}
/**
* 向外公开的方法
*
* @param onTouchingLetterChangedListener
*/
public void setOnTouchingLetterChangedListener(OnTouchingLetterChangedListener onTouchingLetterChangedListener) {
this.onTouchingLetterChangedListener = onTouchingLetterChangedListener;
}
/**
* 接口
*
* @author coder
*/
public interface OnTouchingLetterChangedListener {
void onTouchingLetterChanged(String s); //滑动监听
void onTouchUpListener(); //手指离开监听
}
}
activity
public class FriendnewActivity extends BaseActivity {
private ImageView mIncludeTitleBack;
private TextView mIncludeTitle;
private RecyclerView mFriendnewRv;
private List<FriendNewBean.DataBean> dataBeans = new ArrayList<>();
private FriendNewAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_friendnew);
initView();
initData();
initCallBack();
}
private void initCallBack() {
adapter.setAddListener(new FriendNewAdapter.AddListener() {
@Override
public void Add(int index) {
manage(dataBeans.get(index).getId(),"1");
}
@Override
public void Delete(int index) {
manage(dataBeans.get(index).getId(),"2");
}
});
}
private void manage(int id,String status) {
OkGo.<String>post(okgo.friendTargetupdate)
.params("id",id)
.params("status",status)
.params("token",SPutils.getToken(FriendnewActivity.this))
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
Log.i("friendnewaaa", "管理好友onSuccess: " + response.body());
try {
JSONObject jsonObject = new JSONObject(response.body());
String code = jsonObject.getString("recode");
if (code.equals("110001")){
if (status.equals("1")){
toast("已同意");
}else {
toast("已拒绝");
}
dataBeans.clear();
initData();
}
} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
private void initData() {
OkGo.<String>post(okgo.friendTarget)
.params("token",SPutils.getToken(FriendnewActivity.this))
.execute(new StringCallback() {
@Override
public void onSuccess(Response<String> response) {
Log.i("friendnewaaa", "要加我的好友onSuccess: " + response.body());
Gson gson = new Gson();
FriendNewBean friendNewBean = gson.fromJson(response.body(),FriendNewBean.class);
if (friendNewBean.getRecode().equals("100001")){
dataBeans.addAll(friendNewBean.getData());
adapter.notifyDataSetChanged();
}else if (friendNewBean.getRecode().equals("100002")){
adapter.notifyDataSetChanged();
}
}
@Override
public void onError(Response<String> response) {
super.onError(response);
Log.i("friendnewaaa", "要加我的好友onError: " + response.body());
}
});
}
private void initView() {
mIncludeTitleBack = (ImageView) findViewById(R.id.include_title_back);
mIncludeTitle = (TextView) findViewById(R.id.include_title);
mFriendnewRv = (RecyclerView) findViewById(R.id.friendnew_rv);
mIncludeTitle.setText(R.string.newfriend);
mIncludeTitleBack.setOnClickListener(v -> finish());
adapter = new FriendNewAdapter(this,dataBeans);
mFriendnewRv.setLayoutManager(new LinearLayoutManager(FriendnewActivity.this,LinearLayoutManager.VERTICAL,false));
mFriendnewRv.setAdapter(adapter);
mFriendnewRv.addItemDecoration(new SpacesItemDecoration(0,0,0,2));
}
}
适配器
public class FriendListAdapter extends BaseAdapter {
private Context context;
private List<FriendListBean.DataBeanX> dataBeanXES;
public FriendListAdapter(Context context, List<FriendListBean.DataBeanX> dataBeanXES) {
this.context = context;
this.dataBeanXES = dataBeanXES;
}
@Override
public int getCount() {
return dataBeanXES.size();
}
@Override
public Object getItem(int position) {
return dataBeanXES.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Myhold myhold = null;
if (convertView == null) {
myhold = new Myhold();
convertView = LayoutInflater.from(context).inflate(R.layout.item_friend_list, null);
myhold.mItemFriendListTitle = (TextView) convertView.findViewById(R.id.item_friend_list_title);
myhold.mItemFriendListLv = (MyListView) convertView.findViewById(R.id.item_friend_list_lv);
convertView.setTag(myhold);
}else {
myhold = (Myhold)convertView.getTag();
}
myhold.mItemFriendListTitle.setText(dataBeanXES.get(position).getKey());
List<FriendListBean.DataBeanX.DataBean> dataBeans = dataBeanXES.get(position).getData();
FriendListtreeAdapter adapter = new FriendListtreeAdapter(context,dataBeans);
myhold.mItemFriendListLv.setAdapter(adapter);
myhold.mItemFriendListLv.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
EventBus.getDefault().postSticky(dataBeans.get(position));
RongIM.getInstance().startPrivateChat(context, String.valueOf(dataBeans.get(position).getFr_id()), "");
}
});
return convertView;
}
public int getPositionForSelection(int selection) {
for (int i = 0; i < dataBeanXES.size(); i++) {
String Fpinyin = dataBeanXES.get(i).getKey();
char first = Fpinyin.toUpperCase().charAt(0);
if (first == selection) {
return i;
}
}
return -1;
}
class Myhold {
private TextView mItemFriendListTitle;
private MyListView mItemFriendListLv;
}
}