Android仿人人客户端(v5(4)

    super(context, attrs);

    setupViews();

}



public void setOnClickListener(OnMenuClickListener onClickListener) {

    mOnClickListener = onClickListener;

}



private void setupViews() {

    final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());

    RelativeLayout rlTopNavbar = (RelativeLayout) mLayoutInflater.inflate(R.layout.top_menu_navbar, null);

    addView(rlTopNavbar);



    llShowMenu = (LinearLayout) rlTopNavbar.findViewById(R.id.ll_back);

    mLlDownList = (LinearLayout) rlTopNavbar.findViewById(R.id.ll_down_list);

    mLlRefresh = (LinearLayout) rlTopNavbar.findViewById(R.id.ll_refresh);



    tvTitle = (TextView) rlTopNavbar.findViewById(R.id.tv_title);

    tvRightOperationName = (TextView) rlTopNavbar.findViewById(R.id.tv_right_operation_name);

    ivDownListIcon = (ImageView) rlTopNavbar.findViewById(R.id.iv_down_list_icon);

    ivRefresh = (ImageView) rlTopNavbar.findViewById(R.id.iv_refresh);

    ivRightLine = (ImageView) rlTopNavbar.findViewById(R.id.iv_right_line);



    llShowMenu.setOnClickListener(new View.OnClickListener() {



        @Override

        public void onClick(View v) {

            if (mOnClickListener != null) {

                mOnClickListener.onClick();

            }

        }

    });

}

}




       消息中心视图的布局文件(message.xml):



<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#FFFFFF"

android:orientation="vertical" >



<com.everyone.android.widget.TopMenuNavbar

    android:id="@+id/rl_top_menu_navbar"

    style="@style/top_navbar" />



       消息中心视图的Java文件:



package com.everyone.android.widget;

import android.content.Context;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.FrameLayout;

import android.widget.LinearLayout;

import com.everyone.android.R;

/**

  • 功能描述:消息中心视图

  • @author android_ls

*/

public class MessageLayout extends FrameLayout implements OnClickListener {

private TopMenuNavbar topMenuNavbar;



public TopMenuNavbar getTopMenuNavbar() {

    return topMenuNavbar;

}



public MessageLayout(Context context) {

    super(context);

    setupViews();

}



public MessageLayout(Context context, AttributeSet attrs) {

    super(context, attrs);

    setupViews();

}



private void setupViews() {

    final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());

    LinearLayout rlTopNavbar = (LinearLayout) mLayoutInflater.inflate(R.layout.message, null);

    addView(rlTopNavbar);



    topMenuNavbar = (TopMenuNavbar) rlTopNavbar.findViewById(R.id.rl_top_menu_navbar);

    topMenuNavbar.mLlRefresh.setOnClickListener(this);



    topMenuNavbar.tvTitle.setText("消息中心");

    topMenuNavbar.ivDownListIcon.setVisibility(View.GONE);

    topMenuNavbar.ivRefresh.setVisibility(View.GONE);



}



@Override

public void onClick(View v) {

    switch (v.getId()) {

    case R.id.ll_refresh:



        break;

    default:

        break;

    }



}

}




二、修改新鲜事视图



       修改后的新鲜事视图布局文件(fresh\_news.xml):



<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android=“http://schemas.android.com/apk/res/android”

android:layout_width="fill_parent"

android:layout_height="fill_parent"

android:background="#FFFFFF"

android:orientation="vertical" >



<com.everyone.android.widget.TopMenuNavbar

    android:id="@+id/rl_top_menu_navbar"

    style="@style/top_navbar" />



       修改后的新鲜事视图的Java文件:



package com.everyone.android.widget;

import android.content.Context;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.FrameLayout;

import android.widget.LinearLayout;

import com.everyone.android.R;

/**

  • 功能描述:新鲜事视图

  • @author android_ls

*/

public class FreshNewsLayout extends FrameLayout implements OnClickListener {

private TopMenuNavbar topMenuNavbar;



public TopMenuNavbar getTopMenuNavbar() {

    return topMenuNavbar;

}



public FreshNewsLayout(Context context) {

    super(context);

    setupViews();

}



public FreshNewsLayout(Context context, AttributeSet attrs) {

    super(context, attrs);

    setupViews();

}



private void setupViews() {

    final LayoutInflater mLayoutInflater = LayoutInflater.from(getContext());

    LinearLayout rlTopNavbar = (LinearLayout) mLayoutInflater.inflate(R.layout.fresh_news, null);

    addView(rlTopNavbar);

    

    topMenuNavbar = (TopMenuNavbar) rlTopNavbar.findViewById(R.id.rl_top_menu_navbar);

    topMenuNavbar.mLlDownList.setOnClickListener(this);

    topMenuNavbar.mLlRefresh.setOnClickListener(this);

    topMenuNavbar.ivRightLine.setVisibility(View.GONE);

    topMenuNavbar.tvRightOperationName.setVisibility(View.GONE);

    

}



@Override

public void onClick(View v) {

    switch (v.getId()) {

    case R.id.ll_down_list:



        break;

    case R.id.ll_refresh:



        break;

    default:

        break;

    }



}

}




三、左侧菜单栏添加选中的Item事件监听器



       点击左侧菜单中某个组的Item后,要实现切换父容器中的视图,那么左侧菜单对象就得持有父容器(我们自定义的满足滑动显示或隐藏左侧菜单的ViewGroup)和各个视图的引用。这样,等于左侧菜单与父容器和各个要切换的视图都关联起来了,也就是左侧菜单与其它对象的耦合度高了,编写代码也变得复杂。如果硬要这么做,有错吗?没有。不过我不想这么写,在左侧菜单类添加接口,将每次用户单击的Item的位置信息传到外部。我们让主界面Activity类去实现该接口,完成左侧菜单抛出去的要响应的事件。(这块不是很好描述,或者是我表达能力的问题吧。)



        在父容器(ScrollerContainer)中添加切换视图的方法:



/**

 * 切换视图

 * @param view

 */

public void show(View view) {

    mPanelInvisible = false;

    

    int scrollX = getChildAt(1).getScrollX();

    mScroller.startScroll(scrollX, 0, -scrollX, 0, ANIMATION_DURATION_TIME);

    invalidate();

    

    removeViewAt(1);

    addView(view, 1, getLayoutParams());

}



        对外的接口:



/**

 * 设置选中的Item事件监听器

 * @param seletedListener

 */

public void setOnSeletedListener(onSeletedListener seletedListener) {

    mOnSeletedListener = seletedListener;

}



/**

 * 选中的Item事件监听器

 * @author android_ls

 */

public interface onSeletedListener {

    /**

     * 当前选中的Item事件处理器

     * @param groupPosition 所属组Id

     * @param childPosition 在所属组内的位置

     */

    public abstract void seletedChildView(int groupPosition, int childPosition);

}



      组的Item单击事件监听器:



     mExpandableListView.setOnChildClickListener(new OnChildClickListener() {



        @Override

        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {

            if (mOnSeletedListener == null) {

                return false;

            }



            mGroupPosition = groupPosition;

            mChildPosition = childPosition;



            mOnSeletedListener.seletedChildView(groupPosition, childPosition);

            return true;

        }

    });



       左侧菜单修改后的完整源码:



package com.everyone.android.widget;

import java.util.ArrayList;

import java.util.List;

import android.content.Context;

import android.content.res.Resources;

import android.util.AttributeSet;

import android.view.LayoutInflater;

import android.view.View;

import android.widget.ExpandableListView;

import android.widget.ExpandableListView.OnChildClickListener;

import android.widget.ExpandableListView.OnGroupClickListener;

import android.widget.FrameLayout;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.TextView;

import com.everyone.android.R;

import com.everyone.android.adapter.LeftPanelExListViewAdapter;

import com.everyone.android.entity.LeftPanelListItem;

/**

  • 功能描述:仿人人主界面之左侧面板

  • @author android_ls

*/

public class LeftPanelLayout extends FrameLayout {

/**

 * 用户图标显示组件

 */

public ImageView ivUserIcon;



/**

 * 用户名称显示组件

 */

public TextView tvNickname;



/**

 * 可展开的ListView组件

 */

private ExpandableListView mExpandableListView;



/**

 * ExpandableListView组件的数据适配器

 */

private LeftPanelExListViewAdapter mExListViewAdapter;



/**

 * ExpandableListView组件的数据源

 */

private List<LeftPanelListItem> mListItems = new ArrayList<LeftPanelListItem>();



/**

 * 分组名数组

 */

private String[] mGroupNames;



private onSeletedListener mOnSeletedListener;



private int mGroupPosition;



private int mChildPosition;



public LeftPanelLayout(Context context) {

    super(context);

    setupViews();

}



public LeftPanelLayout(Context context, AttributeSet attrs) {

    super(context, attrs);

    setupViews();

}



private void setupViews() {

    final LayoutInflater mInflater = LayoutInflater.from(getContext());

    LinearLayout viewRoot = (LinearLayout) mInflater.inflate(R.layout.left_panel, null);

    addView(viewRoot);



    ivUserIcon = (ImageView) viewRoot.findViewById(R.id.iv_user_icon);

    tvNickname = (TextView) viewRoot.findViewById(R.id.tv_nickname);

    mExpandableListView = (ExpandableListView) viewRoot.findViewById(R.id.elv_list_view);



    initialized();

}



private void initialized() {

    Resources resources = this.getResources();

    mGroupNames = resources.getStringArray(R.array.left_panel_group_names);



    String[] firstGroupNames = resources.getStringArray(R.array.left_panel_first_group_names);

    String[] secondGroupNames = resources.getStringArray(R.array.left_panel_second_group_names);

    String[] threeGroupNames = resources.getStringArray(R.array.left_panel_group_three_names);



    int[] firstGroupIcons = { 

            R.drawable.left_panel_item_newsfeed_icon_selector, 

            R.drawable.left_panel_item_message_icon_selector,

            R.drawable.left_panel_item_chat_icon_selector, 

            R.drawable.left_panel_item_friends_icon_selector,

            R.drawable.left_panel_item_search_icon_selector };



    int[] secondGroupIcons = { 

            R.drawable.left_panel_item_location_icon_selector, 

            R.drawable.left_panel_item_mainpage_icon_selector,

            R.drawable.left_panel_item_hot_icon_selector,

            R.drawable.left_panel_item_apps_icon_selector };



    int[] threeGroupIcons = { 

            R.drawable.left_panel_item_settings_icon_selector,

            R.drawable.left_panel_item_layout_icon_selector };



    addGroup(0, firstGroupNames, firstGroupIcons);

    addGroup(1, secondGroupNames, secondGroupIcons);

    addGroup(2, threeGroupNames, threeGroupIcons);



    mExListViewAdapter = new LeftPanelExListViewAdapter(getContext(), mListItems);

    mExpandableListView.setAdapter(mExListViewAdapter);



    // 设置默认让所有组都展开

    for (int i = 0; i < mListItems.size(); i++) {

        mExpandableListView.expandGroup(i);

    }



    // 设置OnGroupClick时,不再展开或收缩组内的子项

    mExpandableListView.setOnGroupClickListener(new OnGroupClickListener() {



        @Override

        public boolean onGroupClick(ExpandableListView parent, View v, int groupPosition, long id) {

            // 表示GroupItem的单击事件已被处理

            return true;

        }



    });



    mExpandableListView.setOnChildClickListener(new OnChildClickListener() {



        @Override

        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {

            if (mOnSeletedListener == null) {

                return false;

            }



            mGroupPosition = groupPosition;

            mChildPosition = childPosition;



            mOnSeletedListener.seletedChildView(groupPosition, childPosition);

            return true;

        }

    });

}



/**

 * 添加数据到指定的组

 * @param groupId 组ID

 * @param names 子项的名字数组

 * @param icons 子项的图标数组

 */

private void addGroup(int groupId, String[] names, int[] icons) {

    LeftPanelListItem listItem = new LeftPanelListItem();

    listItem.setId(groupId);

    listItem.setName(mGroupNames[groupId]);

    // 组没有操作指示图标

    // listItem.setDrawableId(drawableId);



    ArrayList<LeftPanelListItem> firstGroup = new ArrayList<LeftPanelListItem>();

    for (int i = 0; i < names.length; i++) {

        LeftPanelListItem firstGroupItem = new LeftPanelListItem();

        firstGroupItem.setId(i);

        firstGroupItem.setName(names[i]);

        firstGroupItem.setDrawableId(icons[i]);



        // 可以无限延伸

        // firstGroupItem.setGroups(null);

        firstGroup.add(firstGroupItem);

    }



    listItem.setGroups(firstGroup);

    mListItems.add(listItem);

}



/**

 * 设置选中的Item事件监听器

 * @param seletedListener

 */

public void setOnSeletedListener(onSeletedListener seletedListener) {

    mOnSeletedListener = seletedListener;

}



/**

 * 选中的Item事件监听器

 * @author android_ls

 */

public interface onSeletedListener {

    /**

     * 当前选中的Item事件处理器

     * @param groupPosition 所属组Id

     * @param childPosition 在所属组内的位置

     */

    public abstract void seletedChildView(int groupPosition, int childPosition);

}

}




  

四、应用主界面源码:



package com.everyone.android.ui;

import android.os.Bundle;

import android.view.ViewGroup.LayoutParams;

import com.everyone.android.AppBaseActivity;

import com.everyone.android.api.OnMenuClickListener;

import com.everyone.android.widget.FreshNewsLayout;

import com.everyone.android.widget.LeftPanelLayout;

import com.everyone.android.widget.LeftPanelLayout.onSeletedListener;

import com.everyone.android.widget.MessageLayout;

最后我想说

为什么很多程序员做不了架构师?
1、良好健康的职业规划很重要,但大多数人都忽略了
2、学习的习惯很重要,持之以恒才是正解。
3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展
4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

id.api.OnMenuClickListener;

import com.everyone.android.widget.FreshNewsLayout;

import com.everyone.android.widget.LeftPanelLayout;

import com.everyone.android.widget.LeftPanelLayout.onSeletedListener;

import com.everyone.android.widget.MessageLayout;

最后我想说

为什么很多程序员做不了架构师?
1、良好健康的职业规划很重要,但大多数人都忽略了
2、学习的习惯很重要,持之以恒才是正解。
3、编程思维没能提升一个台阶,局限在了编码,业务,没考虑过选型、扩展
4、身边没有好的架构师引导、培养。所处的圈子对程序员的成长影响巨大。

金九银十面试季,跳槽季,整理面试题已经成了我多年的习惯!在这里我和身边一些朋友特意整理了一份快速进阶为Android高级工程师的系统且全面的学习资料。涵盖了Android初级——Android高级架构师进阶必备的一些学习技能。

附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题(含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

[外链图片转存中…(img-aieAYhsO-1714361066293)]

里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值