Android 联系人列表实现原理

来源:互联网 发布:windows软件卸载 编辑:程序博客网 时间:2024/06/03 22:42

自定义字母分类列表 A-Z

/** * 参考: https://github.com/DaxiaK/MyDiary 联系人列表 */public class SortLayout extends LinearLayout {    public interface OnTouchLetterChangedListener {        void onTouchLetterChanged(String s);    }    private OnTouchLetterChangedListener onTouchLetterChangedListener;    public void setOnTouchLetterChangedListener(OnTouchLetterChangedListener onTouchLetterChangedListener) {        this.onTouchLetterChangedListener = onTouchLetterChangedListener;    }    private Context mContext;    private TextView sortTextView;    private List<String> sortTextList = new ArrayList<>();    private int choose = -1;    public void setSortTextView(TextView sortTextView) {        this.sortTextView = sortTextView;    }    public SortLayout(Context context) {        this(context, null);    }    public SortLayout(Context context, @Nullable AttributeSet attrs) {        this(context, attrs, 0);    }    public SortLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);        this.mContext = context;        setOrientation(VERTICAL);        initSortText();    }    private void initSortText() {        addView(buildSortText("↑"));        addView(buildSortText("❤"));        for (char i = 'A'; i <= 'Z'; i++) {            addView(buildSortText(String.valueOf(i)));        }        addView(buildSortText("#"));    }    private TextView buildSortText(String sortText) {        sortTextList.add(sortText);        LinearLayout.LayoutParams layoutParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT, 1);        TextView sortTextView = new TextView(mContext);        sortTextView.setLayoutParams(layoutParams);        sortTextView.setGravity(Gravity.CENTER);        sortTextView.setClickable(true);        sortTextView.setText(sortText);        sortTextView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, 13);        sortTextView.setTextColor(Color.BLACK);        return sortTextView;    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        final float y = ev.getY();        final int oldChoose = choose;        final OnTouchLetterChangedListener listener = onTouchLetterChangedListener;        final int clickItem = (int) (y / getHeight() * sortTextList.size());        switch (ev.getAction()) {            case MotionEvent.ACTION_UP:                setBackgroundColor(Color.TRANSPARENT);                choose = -1;                invalidate();                if (sortTextView != null) {                    sortTextView.setVisibility(View.GONE);                }                break;            //touch move & down            default:                setBackgroundColor(Color.parseColor("#aacccccc"));                if (oldChoose != clickItem) {                    if (clickItem >=0 && clickItem < sortTextList.size()) {                        if (listener != null) {                            listener.onTouchLetterChanged(sortTextList.get(clickItem));                        }                        if (sortTextView != null) {                            sortTextView.setText(sortTextList.get(clickItem));                            sortTextView.setVisibility(View.VISIBLE);                        }                        choose = clickItem;                        invalidate();                    }                }                break;        }        return true;//        return super.dispatchTouchEvent(ev);    }

布局

<RelativeLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:background="@android:color/white">        <com.example.alex.viewpagerdemo.sortlayout.SortLayout            android:id="@+id/sort_layout"            android:layout_width="40dp"            android:layout_height="match_parent"            android:layout_marginTop="20dp"            android:layout_marginBottom="20dp"            android:background="@android:color/transparent"            android:layout_alignParentRight="true">        </com.example.alex.viewpagerdemo.sortlayout.SortLayout>        <TextView            android:id="@+id/sort_text_view"            android:layout_width="80dp"            android:layout_height="80dp"            android:gravity="center"            android:background="#cccccccc"            android:layout_centerInParent="true"            android:visibility="gone"            android:textSize="24sp"/>    </RelativeLayout>

MainActivity

public class SortLayoutActivity extends AppCompatActivity {    SortLayout sortLayout;    TextView sortTextView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_sort_layout);        sortLayout = (SortLayout) findViewById(R.id.sort_layout);        sortTextView = (TextView) findViewById(R.id.sort_text_view);        sortLayout.setSortTextView(sortTextView);        sortLayout.setOnTouchLetterChangedListener(new SortLayout.OnTouchLetterChangedListener() {            @Override            public void onTouchLetterChanged(String s) {                Log.d("SortLayout", s);            }        });    }}

效果
这里写图片描述

原创粉丝点击