这个界面  实现的不是微信对话界面。实现的是,focus的状态下,变为放大的另一种布局

重点:

一、定义类型个数

private final int TYPE_COUNT = 2;
    private final int FIRST_TYPE = 0;
    private final int OTHERS_TYPE = 1;

二、重写两个函数

 @Override
    public int getViewTypeCount() {
        return TYPE_COUNT;
    }

@Override
    public int getItemViewType(int position) {
        if (position == mSelectedPosition) {
            return FIRST_TYPE;
        } else {
            return OTHERS_TYPE;
        }
    }

public class CallContactListViewAdapter extends BaseAdapter {

public static final String TAG = CallContactListViewAdapter.class.getName();
    private final int TYPE_COUNT = 2;
    private final int BIG_TYPE = 0;
    private final int SMALL_TYPE = 1;
    private int currentType;

private List<ContactIndex> mContactList;
    private Context mContext;
    private LayoutInflater layoutInflater;
    private int mSelectedPosition = -1;

private Bitmap mBitmap = null;

// private Matrix mMatrix;

public CallContactListViewAdapter(Context context,
            List<ContactIndex> contactList) {
        mContext = context;
        mContactList = contactList;

this.layoutInflater = LayoutInflater.from(context);

// mMatrix = new Matrix();
        // mMatrix.postScale(0.6f,0.6f);
    }

public void setSelectItem(int position) {
        mSelectedPosition = position;
    }

/*
     * (non-Javadoc)
     *
     * @see android.widget.Adapter#getCount()
     */
    @Override
    public int getCount() {
        // Log.d(TAG, "contact list size:" + mContactList.size());
        return mContactList.size();
    }

/*
     * (non-Javadoc)
     *
     * @see android.widget.Adapter#getItem(int)
     */
    @Override
    public Object getItem(int position) {
        if (position >= 0 && position < mContactList.size()) {
            return mContactList.get(position);
            // return mList.get(position % mList.siez());
        }
        return null;
    }

/*
     * (non-Javadoc)
     *
     * @see android.widget.Adapter#getItemId(int)
     */
    @Override
    public long getItemId(int arg0) {
        return arg0;
    }

@Override
    public int getViewTypeCount() {
        return TYPE_COUNT;
    }

@Override
    public int getItemViewType(int position) {
        if (position == mSelectedPosition) {
            return BIG_TYPE;
        } else {
            return SMALL_TYPE;
        }
    }

/*
     * (non-Javadoc)
     *
     * @see android.widget.Adapter#getView(int, android.view.View,
     * android.view.ViewGroup)
     */
    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {

Log.d(TAG, "position:" + position);
        ViewHolder viewHolder = null;

currentType = getItemViewType(position);
        System.out.println("type=" + currentType);
        if (currentType == BIG_TYPE) {

if (convertView == null) {
                viewHolder = new ViewHolder();

convertView = layoutInflater.inflate(R.layout.call_item, null);

viewHolder.friendPic = (ImageView) convertView
                        .findViewById(R.id.callFriendPic);
                viewHolder.friendName = (TextView) convertView
                        .findViewById(R.id.callFriendName);

convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
        } else {
            if (convertView == null) {
                viewHolder = new ViewHolder();

convertView = layoutInflater.inflate(R.layout.call_item_small,
                        null);

viewHolder.friendPic = (ImageView) convertView
                        .findViewById(R.id.callFriendPic);
                viewHolder.friendName = (TextView) convertView
                        .findViewById(R.id.callFriendName);

convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
        }

//         if(mSelectedPosition == position){
//             viewHolder.friendPicBorder.setVisibility(View.VISIBLE);
//             viewHolder.friendName.setTextSize(mContext.getResources().getDimension(R.dimen.callListNameTextSizeBig));
//         }
//         else{
//             mBitmap = BitmapFactory.decodeResource(mContext.getResources(),
//             mContactList.get(position).getPicId());
//             Bitmap resizeBmp =
//             Bitmap.createBitmap(mBitmap,0,0,mBitmap.getWidth(),mBitmap.getHeight(),mMatrix,true);
//             viewHolder.friendPic.setImageBitmap(resizeBmp);
//         }

viewHolder.friendPic.setImageResource(mContactList.get(position)
                .getPicId());
        viewHolder.friendName.setText(mContactList.get(position).getUserName());

return convertView;
    }

private static class ViewHolder {
        ImageView friendPic;
        TextView friendName;
    }
}

三、TV 版本中,ListView 首尾循环相接的方法:

  即,到了最后一个,再按向下键的时候,跳到第一个

  到了第一个,再按向上键的时候,跳到最后一个

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {

switch (keyCode) {
        case KeyEvent.KEYCODE_DPAD_DOWN:
            if (mOldPosition == mContactListAdapter.getCount() - 1) {
                mCallContactListContainer.setSelection(0);
            }
            break;
        case KeyEvent.KEYCODE_DPAD_UP:
            if (mOldPosition == 0) {
                mCallContactListContainer.setSelection(mContactListAdapter
                        .getCount() - 1);
            }
            break;
        }

return super.onKeyDown(keyCode, event);
    }

如果是触屏,涉及到滚动,就比较麻烦

四、 Adapter中自定义的方法  用来在Activity中,一个处于focus状态的item的position

public void setSelectItem(int position) {
        mSelectedPosition = position;
    }

Activity中,给ListView设置选中的Listener

mListView.setOnItemSelectedListener(new OnItemSelectedListener() {

@Override
                    public void onItemSelected(AdapterView<?> adapterView,
                            View view, int position, long arg3) {

mMyAdapter.setSelectItem(position);
                        mMyAdapter.notifyDataSetChanged();
                    }

@Override
                    public void onNothingSelected(AdapterView<?> arg0) {
                    }
});

两种布局的ListVIew Adapter。例如微信对话界面的更多相关文章

  1. RecyclerView添加两种布局

    简介: 本篇博客主要介绍如何在RecyclerView中添加两种布局 思路:主要重写Recyclerview.Adapter中的一些方法 1.public int getItemViewType(in ...

  2. Android 常用UI控件之TabHost(1)TabHost的两种布局方式

    TabHost是Android中的tab组件. TabHost布局文件的基本结构 TabHost下有个layout,这个layout中有TabWidget与FrameLayout.TabWidget是 ...

  3. Android中通过数组资源文件xml与适配器两种方式给ListView列表视图设置数据源

    场景 实现效果如下 注: 博客: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免费下载. 实现 将布局改 ...

  4. 两种经典电商CSS布局

    圣杯布局和双飞翼布局! 两种布局功能相同,都是为了实现两端宽度固定,中间宽度自适应的三栏布局 圣杯布局: 三个区域都处于左浮动状态,并使main的宽度成父容器的100% 为两侧侧边栏添加负margin ...

  5. 七种CSS左侧固定,右侧自适应两栏布局

    一 两栏布局基本HTML和CSS 首先创建基本的HTML布局和最基本的样式. 基本的样式是,两个盒子相距20px, 左侧盒子宽120px,右侧盒子宽度自适应 <div class="w ...

  6. bootstrap的栅格布局与两列布局结合使用

    在工作中我们常常需要实现响应式布局,这个可以使用bootstrap的栅格系统来实现,我们在列里也需要实现一部分的响应式.比如下面的效果图,需要实现左边图标固定,右边的自适应 : 左边固定宽度,右边自适 ...

  7. TouTiao开源项目 分析笔记15 新闻详情之两种类型的实现

    1.预览效果 1.1.首先看一下需要实现的效果. 第一种,文字类型新闻. 第二种,图片类型新闻. 1.2.在NewsArticleTextViewBinder中设置了点击事件 RxView.click ...

  8. 实现顶部轮播,下部listview经典布局的两种方式

    开头: 在做android开发的时候,我们经常会遇到这样的布局,上面是一个图片轮播图,下面是一些列表的项目.很多新闻app,视频类app都采用这样的布局.起初的时候 由于没有很多参考,我自己想到了一种 ...

  9. ListView加载两种以上不同的布局

    不同的项目布局(item layout) Listview一种单一的item 布局有时候不能完全满足业务需求,我们需要加载两种或两种以上不同的布局,实现方法很简单: 重写 getViewTypeCou ...

随机推荐

  1. SQL Server 2016 —— 聚集列存储索引的功能增强

    作者 Jonathan Allen,译者         邵思华         发布于     2015年6月14日   聚集列存储索引(CC Index)是SQL Server 2014中两大最引 ...

  2. RK30SDK开发板驱动分析(二):DDR频率配置

    在内核配置界界面,我们可以很容易的配置DDR的频率,300M OR 600M, so easy! 那么它是如何起作用的呢? 回想 RK30SDK开发板驱动分析(一) 末尾提到MACHINE_START ...

  3. IE跨Iframe时Session丢失问题

    例如IIS下,可以打开IIS窗口——〉选择一个网站——〉属性——〉http头,增加一个http头 然后输入头名:P3P 输入头内容:CP=CAO PSA OUR 点评:与上一个方法类似,此方法也要求第 ...

  4. 【新手专属】IntelliJ IDEA删除项目

    这两天刚从Eclipse转手IDEA,每次都是直接删项目文件,后来百度一下才明白原来应该这样~~~ IntelliJ IDEA 删除项目,共三步: 第一步:记住当前项目文件路径1,然后点击file-- ...

  5. 求一些数字字符参数的和(Java)

    一.思路 输入数字(字符型)参数: 将字符型强制转化为整数型: 求和: 输出: 二.流程图 三.源程序代码及结果

  6. 第三方开源--Android Image Cropper--图片裁剪

    github下载地址:https://github.com/ArthurHub/Android-Image-Cropper 有两种使用方式: 第一种:Activity用法 1.添加 CropImage ...

  7. db2生成连续日期

    //生成时间段内连续日期 select * from ( select date('2008-01-01') + (row_NUMBER() over () -1) days AS datennn f ...

  8. 201621123014《Java程序设计》第十三周学习总结

    1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网 ...

  9. dyci——IOS动态代码注入

    有时候用xib,更改了布局需要重新运行才可以看到效果,对于比较复杂的应用尤其浪费时间,下面介绍一个工具dyci-不需要重Run应用,也能看到效果 yci的网址:https://github.com/D ...

  10. 信息标记 以及信息提取--xml-json-yaml

    1 信息标记的三种方式:  XML: JSON: YAML: 1 缩进 表示所属关系:  2 - 表示并列关系:  3 | 表示整块数据:  HTML----XML的一种形式: 2 信息提取的方法: ...