两种布局的ListVIew Adapter。例如微信对话界面

这个界面  实现的不是微信对话界面。实现的是,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) {
                    }
});

时间: 2024-12-23 12:41:28

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

adapter中有两种布局

A B 两种布局  重用view 对象 有可能应用B布局 结果从用的是A布局  所以重用之前要判断 if (position == list.size() - 1) {            View addView = inflater.inflate(R.layout.gv_item_add, null);            LogUtil.i(TAG, "=====返回添加view===");            return addView;        } else

七种实现左侧固定,右侧自适应两栏布局的方法

总结一下左边固定,右边自适应的两栏布局的七种方法.其中有老生常谈的float方法,BFC方法,也有CSS3的flex布局与grid布局.并非所有的布局都会在开发中使用,但是其中也会涉及一些知识点.关于最终的效果,可以查看这里 常用的宽度自适应的方法通常是利用了block水平的元素宽度能随父容器调节的流动特性.另外一种思路是利用CSS中的calc()方法来动态设定宽度.还有一种思路是,利用CSS中的新型布局flex layout与grid layout. 首先创建基本的HTML布局和最基本的样式.

两种经典电商CSS布局

圣杯布局和双飞翼布局! 两种布局功能相同,都是为了实现两端宽度固定,中间宽度自适应的三栏布局 圣杯布局: 三个区域都处于左浮动状态,并使main的宽度成父容器的100% 为两侧侧边栏添加负margin 用以调整位置 其中摆在左边的left的margin-left 为-100% 右边的right的margin-left 则为负的其自身的宽度 (浮动元素的负margin到一定值后会使其自身往上一行移动的原理) 为class=container 的主容器设置左右padding值 为以后的侧边栏定位空出

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

在工作中我们常常需要实现响应式布局,这个可以使用bootstrap的栅格系统来实现,我们在列里也需要实现一部分的响应式.比如下面的效果图,需要实现左边图标固定,右边的自适应 : 左边固定宽度,右边自适应,这个时候我就想到了两列布局,将左右设置float,左边设置固定宽度,右边的宽度为calc(100% - 左边的宽度),把这两种布局结合使用就可以实现效果.

Android中常见的几种布局的总结

众所周知,一个应用程序的良好与否,很大程度上取决于它的用户界面.这就像是一个人给人的第一感觉也是从脸开始的一样.一个应用程序首先展示给客户的就是它的界面,通途的说,也就是软件的脸面.只有良好的用户交互界面,才能在第一时间抓住客户心理,取得优势.那么今天我就来给大家说一下在Android程序的开发过程中,对于Android应用程序的一些常见的布局以及个人的一些看法,希望对大家有所帮助. 在Android4.0之前一共有5种关于Android的布局,分别是:LinearLayout(线性布局),Re

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

开头: 在做android开发的时候,我们经常会遇到这样的布局,上面是一个图片轮播图,下面是一些列表的项目.很多新闻app,视频类app都采用这样的布局.起初的时候 由于没有很多参考,我自己想到了一种实现方式,就是用scrollview作为外面最大的布局,然后里面嵌套viewpager和listview,但是我现在非常不推荐这种方式,一方面由于这种方式 需要将listview完全展开,缺少了getview函数中应该有的复用与优化.而且结构嵌套复杂.经过一番查找与学习,学习到两种比较规范或者结构比

Android ListView两种长按弹出菜单方式

* 知识点1:ListView item:两种长按弹出菜单方式* 知识点2:ListView SimpleAdapter的使用*  知识点 3:在java代码中创建一个ListView*/ -----------------------------------------------------Activity[mw_shl_code=java,true]package org.gxl.com; public class ListOnLongClickActivity extends Activ

在Activity中响应ListView内部按钮的点击事件的两种方法

转载:http://www.cnblogs.com/ivan-xu/p/4124967.html 最近交流群里面有人问到一个问题:如何在Activity中响应ListView内部按钮的点击事件,不要在Adapter中响应? 对于这个问题,我最初给他的解答是,在Adapter中定义一个回调接口,在Activity中实现该接口,从而实现对点击事件的响应. 下班后思考了一下,觉得有两种方式都能比较好的实现:使用接口回调和使用抽象类回调. 正好可以复习一下接口和抽象类的区别,于是写了两个Demo: 1.

【Android UI设计与开发】第14期:顶部标题栏(五)两种方式实现仿微信标题栏弹窗效果

转载请注明出处:http://blog.csdn.net/yangyu20121224/article/details/9093821         博主在这篇文章中将会继续围绕顶部标题栏专题来进行实例讲解,今天要讲解的主题是分别使用PopupWindow和Activity两种不同的方式来实现仿微信顶部标题栏弹窗的这样一个效果. 一.实现效果图 这里为了演示方便,我将两种方法放在一个应用程序中演示,这个是主界面 虽然两种实现的方式不一样,但是最终的效果图都是差不多的     二.项目结构图