首先写上自定义的类
package com.example.mr.yodo.ui; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; import android.support.annotation.Nullable; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; import android.view.View; /** * Created by Mr赵 on 2018/2/3. */ public class QuickIndexBar extends View { //绘制的内容 private static final String[] letters = new String[]{ "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 Paint paint; private int mwidth; private int mheigh; private float callwidth; private float y; private int tableIndex; public QuickIndexBar(Context context) { this(context, null); } public QuickIndexBar(Context context, @Nullable AttributeSet attrs) { this(context, attrs, 0); } public QuickIndexBar(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); //绘制一个画笔 initPaint(); } private void initPaint() { //初始化一个画笔,抗锯齿 paint = new Paint(Paint.ANTI_ALIAS_FLAG); //文本加粗 paint.setTypeface(Typeface.DEFAULT_BOLD); //文本颜色 paint.setColor(Color.BLACK); paint.setTextSize(25); } //获取控件的宽高 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); mwidth = getMeasuredWidth(); mheigh = getMeasuredHeight(); //获取单元格的宽度 callwidth = mwidth * 1.0f / (letters.length); } //设置文本 @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); //循环设置每一个文本 for (int i = 0; i < letters.length; i++) { String letter = letters[i]; //设置Y轴 float Y = mheigh * 0.5f + paint.descent() * 0.5f; //设置X轴 float X = callwidth * 0.5f - paint.descent() * 0.5f + i * callwidth; //设置文本 canvas.drawText(letter, X, Y, paint); } } //B.记录用户上一次按下的位置,以便进行判断这一次所按住的位置是否还是上一次的位置,如果是的话,不做任何处理 private int lastIndex = -1; @Override public boolean onTouchEvent(MotionEvent event) { switch (event.getAction()) { //计算用户按到哪个字母的范围,主要是Y周 case MotionEvent.ACTION_DOWN://按下时,回调 case MotionEvent.ACTION_MOVE://移动时,回调 //获取X轴总长 y = event.getX(); //获取点中的字幕索引 tableIndex = (int) (y / callwidth); if (tableIndex != lastIndex) { if (tableIndex >= 0 && tableIndex < letters.length) { String s = letters[tableIndex]; if (mOnLetterUpdateListener != null) { mOnLetterUpdateListener.onLetterUpdate(s); } lastIndex = tableIndex; } } break; case MotionEvent.ACTION_UP://松开时,回调 break; } return true; } //C.定义接口 public interface OnLetterUpdateListener { void onLetterUpdate(String letter); } //C.定义接口对象 private OnLetterUpdateListener mOnLetterUpdateListener; //C.暴露方法,让外界传过来一个实现接口的类对象 public void setOnLetterUpdateListener(OnLetterUpdateListener onLetterUpdateListener) { mOnLetterUpdateListener = onLetterUpdateListener; } }
详activity里暴露出的方法
package com.example.mr.yodo; import android.content.Intent; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.OrientationHelper; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.StaggeredGridLayoutManager; import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.Toast; import com.example.mr.yodo.adapter.Pinpai; import com.example.mr.yodo.adapter.PinpaiAdapter; import com.example.mr.yodo.adapter.PubuAdapter; import com.example.mr.yodo.bean.Liebean; import com.example.mr.yodo.bean.Remenbean; import com.example.mr.yodo.interfase.LiePjiekou; import com.example.mr.yodo.interfase.RemenPjiekou; import com.example.mr.yodo.presenter.LiePresenter; import com.example.mr.yodo.presenter.PubuPresenter; import com.example.mr.yodo.ui.QuickIndexBar; import com.example.mr.yodo.utils.ToastUtils; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener, RemenPjiekou, QuickIndexBar.OnLetterUpdateListener, LiePjiekou, PubuAdapter.getposition { private RelativeLayout search; private RecyclerView pubu; private PubuPresenter pubuPresenter; private List<Remenbean.DataBean> data; private QuickIndexBar quick; private ListView lv; private LiePresenter liePresenter; private List<Pinpai> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); } private void initView() { search = (RelativeLayout) findViewById(R.id.search); pubu = (RecyclerView) findViewById(R.id.pubu); quick = findViewById(R.id.quick); lv = findViewById(R.id.lv); //点击事件 search.setOnClickListener(this); pubuPresenter = new PubuPresenter(this); pubuPresenter.getpath(); quick.setOnLetterUpdateListener(this); LiePresenter liePresenter = new LiePresenter(this); liePresenter.getpath(); } @Override public void onClick(View view) { switch (view.getId()) { case R.id.search: ToastUtils.getToast(MainActivity.this, "这是搜索"); break; } } /* * 图片 * */ @Override public void success(Remenbean json) { data = json.getData(); pubu.setLayoutManager(new StaggeredGridLayoutManager(3, OrientationHelper.VERTICAL)); PubuAdapter pubuAdapter = new PubuAdapter(data, MainActivity.this); pubuAdapter.getthis(MainActivity.this); pubu.setAdapter(pubuAdapter); } @Override protected void onDestroy() { super.onDestroy(); if (pubuPresenter != null) { pubuPresenter.kong(); } } //暴露出来的方法--展示对应的条目 @Override public void onLetterUpdate(String letter) { ToastUtils.getToast(MainActivity.this, letter); for(int i=0;i<list.size();i++){ String l = list.get(i).getName().charAt(0) + ""; if(TextUtils.equals(l,letter)){ lv.setSelection(i); break; } } } /* * * 返回的数据 * */ @Override public void success(Liebean json) { if(json!=null){ if(json.getCode()==200){ //创建的方法获取数据 List<String> getname = getname(json); //创建存放数据的集合 list = new ArrayList<>(); for (int i=0;i<getname.size();i++){ String name = getname.get(i); list.add(new Pinpai(name,"")); } Collections.sort(list); PinpaiAdapter pinpaiAdapter = new PinpaiAdapter(list, MainActivity.this); lv.setAdapter(pinpaiAdapter); } } } /* * 此方法用于获取数据 * */ private List<String> getname(Liebean json) { List<String> lists = new ArrayList<>(); Liebean.DataBean data = json.getData(); for (int i=0;i<data.getB().size();i++){ lists.add(data.getB().get(i).getBrand_name()); } for (int i=0;i<data.getC().size();i++){ lists.add(data.getC().get(i).getBrand_name()); } for (int i=0;i<data.getD().size();i++){ lists.add(data.getD().get(i).getBrand_name()); } for (int i=0;i<data.getF().size();i++){ lists.add(data.getF().get(i).getBrand_name()); } for (int i=0;i<data.getG().size();i++){ lists.add(data.getG().get(i).getBrand_name()); } for (int i=0;i<data.getH().size();i++){ lists.add(data.getH().get(i).getBrand_name()); } for (int i=0;i<data.getJ().size();i++){ lists.add(data.getJ().get(i).getBrand_name()); } for (int i=0;i<data.getL().size();i++){ lists.add(data.getL().get(i).getBrand_name()); } for (int i=0;i<data.getM().size();i++){ lists.add(data.getM().get(i).getBrand_name()); } for (int i=0;i<data.getO().size();i++){ lists.add(data.getO().get(i).getBrand_name()); } for (int i=0;i<data.getP().size();i++){ lists.add(data.getP().get(i).getBrand_name()); } for (int i=0;i<data.getR().size();i++){ lists.add(data.getR().get(i).getBrand_name()); } for (int i=0;i<data.getT().size();i++){ lists.add(data.getT().get(i).getBrand_name()); } for (int i=0;i<data.getV().size();i++){ lists.add(data.getV().get(i).getBrand_name()); } return lists; } @Override public void Click(int position) { Intent intent = new Intent(MainActivity.this, DetailsActivity.class); String brand_id = data.get(position).getBrand_id(); intent.putExtra("breand_id",brand_id); startActivity(intent); } }
将文字转换为拼音工具类
package com.example.mr.yodo.utils; import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinOutputFormat; import net.sourceforge.pinyin4j.format.exception.BadHanyuPinyinOutputFormatCombination; /** * Created by Mr赵 on 2018/2/3. */ public class Pinyinuiil { public static String getpinyin(String string){ //创建对象 HanyuPinyinOutputFormat forment = new HanyuPinyinOutputFormat(); //将字符串成转换字符数组 char[] chars = string.toCharArray(); //创建缓冲区 StringBuilder sb = new StringBuilder(); //循环遍历数组进行判断 for(int i=0;i<chars.length;i++){ char aChar = chars[i]; if(Character.isWhitespace(aChar)){ continue; } //如果不是汉字 if(aChar>-128&&aChar<127){ sb.append(aChar); }else{ try { String s = PinyinHelper.toHanyuPinyinStringArray(aChar, forment)[0]; sb.append(s); } catch (BadHanyuPinyinOutputFormatCombination badHanyuPinyinOutputFormatCombination) { badHanyuPinyinOutputFormatCombination.printStackTrace(); } } } return sb.toString(); } }
设置存放拼音和名字的封装类进行了排序
package com.example.mr.yodo.adapter; import android.support.annotation.NonNull; import com.example.mr.yodo.utils.Pinyinuiil; /** * Created by Mr赵 on 2018/2/3. */ public class Pinpai implements Comparable<Pinpai>{ private String name; private String pinyin; public Pinpai(String name, String pinyin) { this.name = name; this.pinyin = pinyin; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPinyin() { return pinyin; } public void setPinyin(String pinyin) { this.pinyin = pinyin; } @Override public int compareTo(@NonNull Pinpai pinpai) { return this.pinyin.compareTo(pinpai.pinyin); } }