Android 联系人列表实现原理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_24078843/article/details/78864677

自定义字母分类列表 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);
            }
        });
    }
}

效果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_24078843/article/details/78864677