zoukankan      html  css  js  c++  java
  • 两种布局的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) {
                        }
    });

  • 相关阅读:
    Android Studio遇到了“No USB devices or running emulators detected”
    (转)Android Studio启动AVD遇到的问题 ( HAXM安装失败)
    (转)秒懂,Java 注解 (Annotation)你可以这样学 ---- 重要 注解定义与反射解析
    DSL简介(转)
    有什么软件可以让手机使用卫星通信吗?
    Openfire调整成自己的IM部署到LInux系统上
    cpu和gpu的区别
    (转)OpenFire源码学习之二十七:Smack源码解析
    (转)OpenFire源码学习之十八:IOS离线推送
    (转)openfire插件开发(三)通过http方式向openfire客户端发信息
  • 原文地址:https://www.cnblogs.com/maxiaodoubao/p/4129397.html
Copyright © 2011-2022 走看看