自定义——侧边索引

首先写上自定义的类

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);
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值