精华内容
下载资源
问答
  • 公司有个项目要用到类似手机QQ聊天记录列表ListView左右滑动后改变item的效果,网上没找到好的代码,偶然在安卓巴士的开源站http://d.apkbus.com/里面找到了SwipeToDismiss的源码...改成自己的显示另一个view的效果就行...
  • Android ListView Item滑动进入动画效果

    热门讨论 2015-08-26 23:12:06
    Android ListView Item滑动进入动画效果,仿照的事窝牛装修app的动画,很酷炫。可参考我的博客:http://blog.csdn.net/zuiwuyuan?viewmode=list
  • Android 硬布局item的高级写法

    千次阅读 2020-12-21 19:37:52
    效果: 这种布局应该是非常常见了,且写的比较...先看常规item写法,横向的LinearLayout嵌套三个子View,分别是 左边的ImageView, 中间的TextView, 和右边的ImageView。 然后每个横向的LinearLayout之间添加一个高

    效果:

    在这里插入图片描述
    这种布局应该是非常常见了,且写的比较多。

    今天简单探讨一下效果图中上下两种布局的写法。

    比较

    上下效果一致行数层级
    上部分1213
    下部分552
    下部分继续精简282

    可以看出,对比还是很明显的,精简到最后只有最开始的四分之一。

    上部分

    先看常规item写法,横向的LinearLayout嵌套三个子View,分别是

    • 左边的ImageView,
    • 中间的TextView,
    • 和右边的ImageView。

    然后每个横向的LinearLayout之间添加一个高度1dp的View来作为横线。

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginStart="@dimen/dp_15"
            android:layout_marginTop="@dimen/dp_20"
            android:layout_marginEnd="@dimen/dp_15"
            android:layout_marginBottom="@dimen/dp_20"
            android:background="@drawable/shape_bg_white"
            android:orientation="vertical">
    
            <LinearLayout
                android:id="@+id/ll1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:foreground="?android:attr/selectableItemBackground"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:padding="@dimen/dp_20">
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="@string/app_name"
                    android:src="@mipmap/ic_agreement" />
    
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_weight="1"
                    android:includeFontPadding="false"
                    android:text="删除个人信息"
                    android:textColor="@color/color_505258"
                    android:textSize="@dimen/sp_14" />
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="@string/app_name"
                    android:src="@mipmap/ic_arrow_right" />
    
            </LinearLayout>
    
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginStart="@dimen/dp_50"
                android:background="@color/color_F6F6F6" />
    
            <LinearLayout
                android:id="@+id/ll2"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:foreground="?android:attr/selectableItemBackground"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:padding="@dimen/dp_20">
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="@string/app_name"
                    android:src="@mipmap/ic_agreement" />
    
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_weight="1"
                    android:includeFontPadding="false"
                    android:text="注销账户"
                    android:textColor="@color/color_505258"
                    android:textSize="@dimen/sp_14" />
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="@string/app_name"
                    android:src="@mipmap/ic_arrow_right" />
    
            </LinearLayout>
    
            <View
                android:layout_width="match_parent"
                android:layout_height="1dp"
                android:layout_marginStart="@dimen/dp_50"
                android:background="@color/color_F6F6F6" />
    
            <LinearLayout
                android:id="@+id/ll3"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:foreground="?android:attr/selectableItemBackground"
                android:gravity="center_vertical"
                android:orientation="horizontal"
                android:padding="@dimen/dp_20">
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="@string/app_name"
                    android:src="@mipmap/ic_agreement" />
    
                <TextView
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:layout_marginStart="@dimen/dp_20"
                    android:layout_weight="1"
                    android:includeFontPadding="false"
                    android:text="关于"
                    android:textColor="@color/color_505258"
                    android:textSize="@dimen/sp_14" />
    
                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:contentDescription="@string/app_name"
                    android:src="@mipmap/ic_arrow_right" />
    
            </LinearLayout>
    
        </LinearLayout>
    

    最外层LinearLayout的background:

    <?xml version="1.0" encoding="utf-8"?>
    <shape xmlns:android="http://schemas.android.com/apk/res/android">
        <corners android:radius="10dp" />
        <solid android:color="@color/white" />
    </shape>
    

    可以看到嵌套虽然不深,但是已经拉的很长,不易阅读修改。

    且 哪怕是一层的嵌套优化,也是优化,积少成多。

    下部分

    利用TextView的drawableStart和drawableEnd属性,来做简化,可以直接去掉左右两边的ImageView。

    至于分割线,利用LinearLayout的divider和showDividers属性,写个shape,来做简化,去掉item之间做横线的View。

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/dp_15"
            android:layout_marginVertical="@dimen/dp_20" 
            android:background="@drawable/shape_bg_white"
            android:divider="@drawable/shape_divider_my"
            android:orientation="vertical"
            android:showDividers="middle">
    
            <TextView
                android:id="@+id/tv_delete_user"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="@dimen/dp_16"
                android:foreground="?android:attr/selectableItemBackground"
                android:gravity="center_vertical"
                android:includeFontPadding="false"
                android:padding="@dimen/dp_20"
                android:text="删除个人信息"
                android:textColor="@color/color_505258"
                android:textSize="@dimen/sp_14"
                app:drawableEndCompat="@mipmap/ic_arrow_right"
                app:drawableStartCompat="@mipmap/ic_agreement" />
    
            <TextView
                android:id="@+id/tv_logout_user"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="@dimen/dp_16"
                android:foreground="?android:attr/selectableItemBackground"
                android:gravity="center_vertical"
                android:includeFontPadding="false"
                android:padding="@dimen/dp_20"
                android:text="注销账户"
                android:textColor="@color/color_505258"
                android:textSize="@dimen/sp_14"
                app:drawableEndCompat="@mipmap/ic_arrow_right"
                app:drawableStartCompat="@mipmap/ic_agreement" />
    
            <TextView
                android:id="@+id/tv_about"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:drawablePadding="@dimen/dp_16"
                android:foreground="?android:attr/selectableItemBackground"
                android:gravity="center_vertical"
                android:includeFontPadding="false"
                android:padding="@dimen/dp_20"
                android:text="关于"
                android:textColor="@color/color_505258"
                android:textSize="@dimen/sp_14"
                app:drawableEndCompat="@mipmap/ic_arrow_right"
                app:drawableStartCompat="@mipmap/ic_agreement" />
    
        </LinearLayout>
    

    shape:

    <?xml version="1.0" encoding="utf-8"?>
    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:left="@dimen/dp_50" >
            <shape android:shape="rectangle">
                <solid android:color="@color/color_F6F6F6" />
                <size android:height="1dp" />
            </shape>
        </item>
    </layer-list>
    

    可以看到,层级减少了,行数也减少了,看起来清爽多了。

    style简化

    尽管如此,我们还是有可以简化的空间。

    TextView有一些共同属性,可以抽取做一个style。

        <style name="MyTextView">
            <item name="android:layout_width">match_parent</item>
            <item name="android:layout_height">wrap_content</item>
            <item name="android:drawablePadding">@dimen/dp_16</item>
            <item name="android:foreground">?android:attr/selectableItemBackground</item>
            <item name="android:gravity">center_vertical</item>
            <item name="android:includeFontPadding">false</item>
            <item name="android:padding">@dimen/dp_20</item>
            <item name="android:textColor">@color/color_505258</item>
            <item name="android:textSize">@dimen/sp_14</item>
            <item name="drawableEndCompat">@mipmap/ic_arrow_right</item>
        </style>
    

    再看简化后的代码

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_marginHorizontal="@dimen/dp_15"
            android:layout_marginVertical="@dimen/dp_20" 
            android:background="@drawable/shape_bg_white"
            android:divider="@drawable/shape_divider_my"
            android:orientation="vertical"
            android:showDividers="middle">
    
            <TextView
                android:id="@+id/tv_delete_user"
                style="@style/MyTextView"
                android:text="删除个人信息"
                app:drawableStartCompat="@mipmap/ic_agreement" />
    
            <TextView
                android:id="@+id/tv_logout_user"
                style="@style/MyTextView"
                android:text="注销账户"
                app:drawableStartCompat="@mipmap/ic_agreement" />
    
            <TextView
                android:id="@+id/tv_about"
                style="@style/MyTextView"
                android:text="关于"
                app:drawableStartCompat="@mipmap/ic_agreement" />
    
        </LinearLayout>
    

    更加精简了,只有简化前的一半,共同属性封装,只需要关注业务参数。

    核心属性

    LinearLayout

    • divider,分割线
    • showDividers,分割线的显示方式
    • layout_marginVertical,代替原来的layout_marginTop、layout_marginBottom
    • layout_marginHorizontal,代替原来的layout_marginStart、layout_marginEnd

    题外话,LinearLayout的android:animateLayoutChanges=“true”,可以在其子view添加移除的时候添加简单的动画。

    TextView

    • drawableEndCompat,即原来的drawableEnd,设置右边的drawable,其他方向同理
    • drawablePadding,drawable与文字之前的内边距
    • includeFontPadding,TextView默认top是有6dp的padding的,false可去掉,小细节
    • foreground,添加这个属性会有水波纹的点击效果,省了写selector

    ok,到此结束,无聊的知识又增加了。

    展开全文
  • android中listview的item滑动删除效果,已解决listview点击问题
  • 改代码主要是针对listview修改指定item字体颜色
  • 昨天接到个需求,要求功能列表的Item点击后(即选中后)要变大(像智能电视选中那样)。突出选中效果。 一开始打算用动态布局来实现。尝试了一番,不行。没有效果。 随即Google,百度一顿操作,发现基本全是自定义...

    要求功能列表的Item点击后(即选中后)要变大(像智能电视选中那样)。突出选中效果。

    一开始打算用动态布局来实现。尝试了一番,不行。没有效果。

    随即Google,百度一顿操作,发现基本全是自定义View实现的。几百行代码几百行代码的一顿猛操作。99%都是做TV上的应用。罗里吧嗦一大堆,逛了一圈没有合适的轮子,直接pass。

    还有个是继承所需要放大缩小的控件重写方法

    https://www.jianshu.com/p/7b20eb0f1730 他这个似乎是做智能电视类型的APP,是取到焦点放大,失焦缩小,我改成了点击,试了下没用,没效果。做智能电视APP的可以试下;

    本打算自己重写个View来实现。

    突然想到有个属性  setScaleX  可以设置缩放比例;放大我直接按倍数set不就行了?立马写了Demo发现果然ojbk。

    代码很简单,按照常规的recyclerView和其Adapter的使用方法创建视图即可。

    注意

    父布局要加上 clipChildren="false" 不剪切溢出的子视图。一定要加,不然会出现放大被遮挡的BUG;

    放大缩小核心代码 写在适配器里

    if (getItem() == i) {
                //1.1为原来的大小+1的0.1倍放大
                my.itemView.findViewById(R.id.speed_view).setScaleX(1.3f);
                my.itemView.findViewById(R.id.speed_view).setScaleY(1.3f);
            } else {
                //缩小同理   1为布局设定的大小
                my.itemView.findViewById(R.id.speed_view).setScaleX(1f);
                my.itemView.findViewById(R.id.speed_view).setScaleY(1f);
            }

    Demo地址:https://github.com/zhuangguangkang0013/item.git

    限速云地址:https://pan.baidu.com/s/1a1PE_n2vLvsjQFqjUEMa4w  提取码:hz04

    CSDN地址:https://download.csdn.net/download/u011046184/11146644

    效果图: 点击Item  item变大

    展开全文
  • //holder = new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_content, parent, false)); return new ItemViewHolder(v); } @Override public void onBindViewHolder...

    要实现的效果:
    这是我们要实现的效果

    MainActivity核心代码:

    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    mTvRecycler.setLayoutManager(layoutManager);
    mMyRecyclerViewAdapter = new MyRecyclerViewAdapter(TvStationActivity.this,mList);
    //给RecyclerView设置适配器
    mTvRecycler.setAdapter(mMyRecyclerViewAdapter);
    

    activity_main.xml 布局:

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        xmlns:app="http://schemas.android.com/apk/res-auto">
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/tv_recycler"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginBottom="25dp"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            >
    
        </android.support.v7.widget.RecyclerView>
    
    </android.support.constraint.ConstraintLayout>
    

    Adapter 适配器:外层RecyclerView

    /**
     * @author 小红妹
     * @date 2018/10/20.
     * @describe
     * @copyright 
     */
    
    public class MyRecyclerViewAdapter extends RecyclerView.Adapter<MyRecyclerViewAdapter.ItemViewHolder> {
    
        private Context mContext;
        private List<String> mDatas;
        private ItemViewHolder holder;
        private ItemRecyclerViewAdapter mItemRecyclerViewAdapter;
    
        public MyRecyclerViewAdapter (Context pContext,List<String> data){
            this.mContext = pContext;
            this.mDatas = data;
        }
    
        class ItemViewHolder extends RecyclerView.ViewHolder {
            TextView mTextView;
            RecyclerView mRecyclerView;
    
            ItemViewHolder(View itemView) {
                super(itemView);
                mTextView = itemView.findViewById(R.id.tv_recycler_name);
                mRecyclerView = itemView.findViewById(R.id.tv_recycler_view);
            }
        }
    
        @NonNull
        @Override
        public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            //LayoutInflater.from指定写法
            View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_content, parent, false);
            //holder = new ItemViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_content, parent, false));
            return new ItemViewHolder(v);
        }
    
        @Override
        public void onBindViewHolder(@NonNull ItemViewHolder holder, int position) {
            holder.mTextView.setText(mDatas.get(position));
            holder.mRecyclerView.setHasFixedSize(true);
            holder.mRecyclerView.setLayoutManager(new GridLayoutManager(mContext, 4,
                    GridLayoutManager.VERTICAL, false));
            mItemRecyclerViewAdapter = new ItemRecyclerViewAdapter(position);
            holder.mRecyclerView.setAdapter(mItemRecyclerViewAdapter);
            drawRecyclerView();
        }
    
        @Override
        public int getItemCount() {
            return mDatas.size();
        }
    
        /**
         * RecyclerView 内层点击事件方法
         */
        private void drawRecyclerView() {
            //RecyclerView点击事件
            mItemRecyclerViewAdapter.setOnItemClickListener(new ItemRecyclerViewAdapter.OnItemClickListener() {
                @Override
                public void onItemClick(View view, int position) {
                    Toast.makeText(mContext, ""+position, Toast.LENGTH_SHORT).show();
                }
    
            });
        }
    
    }
    
    

    RecyclerView外层布局item_home_content.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <TextView
            android:id="@+id/tv_recycler_name"
            android:layout_width="match_parent"
            android:layout_height="45dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            android:text="TextView"
            android:textSize="19sp"
            android:gravity="center_vertical"
            android:background="@color/whitesmoke"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
        <android.support.v7.widget.RecyclerView
            android:id="@+id/tv_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_marginEnd="8dp"
            android:layout_marginStart="8dp"
            android:layout_marginTop="8dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/tv_recycler_name">
    
        </android.support.v7.widget.RecyclerView>
    
    </android.support.constraint.ConstraintLayout>
    

    Adapter 适配器:内层RecyclerView

    /**
     * @author 小红妹
     * @date 2018/10/20.
     * @describe
     * @copyright
     */
    
    public class ItemRecyclerViewAdapter extends
            RecyclerView.Adapter<ItemRecyclerViewAdapter.MyViewHolder> implements View.OnClickListener {
    
        private int mInt;
        private Home mHome;
        private List<Home> mHomes;
        private String[] localTV = new String[]{
                "湖南卫视", "江苏卫视", "浙江卫视", "东方卫视",
                "北京卫视", "安徽卫视", "山东卫视", "深圳卫视",
                "江西卫视", "黑龙江台", "广东卫视", "天津卫视",
                "湖北卫视", "河北卫视", "重庆卫视", "东南卫视",
                "甘肃卫视", "广西卫视", "贵州卫视", "河南卫视",
                "吉林卫视", "辽宁卫视", "旅游卫视", "内蒙古台",
                "宁夏卫视", "青海卫视", "四川卫视", "陕西卫视",
                "山西卫视", "新疆卫视", "西藏卫视", "云南卫视",
                "南方卫视", "香港卫视", "凤凰中文", "凤凰资讯"};
    
        private String[] cctv = new String[]{
                "CCTV1", "CCTV2", "CCTV3", "CCTV4",
                "CCTV5", "CCTV5+", "CCTV6", "CCTV7",
                "CCTV8", "CCTV9", "CCTV10", "CCTV11",
                "CCTV12", "CCTV13", "CCTV14", "CCTV15",
                "央视音乐", "央视军事", "央视新闻", "央视少儿"};
    
        private String[] mLocal = new String[]{
                "广州新闻", "广州经济", "广州少儿", "广州综合",
                "广东新闻", "南方卫视", "南方经济", "广东珠江",
                "南方影视", "南方综艺", "深圳都市", "深圳公共",
                "金华公共", "温州经济", "温州都市", "嘉兴综合"};
    
        private String[] mSports = new String[]{
                "CCTV5", "CCTV5+", "广东体育", "五星体育",
                "北京体育", "风云足球", "广州竞赛", "欧洲足球"};
    
        private String[] mMusic = new String[]{
                "华龙直播", "经典串烧", "伤感男人", "发烧慢摇",
                "汽车大碟", "酒吧慢摇", "激情舞曲", "电音舞曲"};
    
        private String[] mFilm = new String[]{
                "央视电影", "家庭剧场", "喜剧电影", "动作电影",
                "经典剧场", "热播电视", "都市剧场", "经典大片"};
    
        private String[] mCartoon = new String[]{
                "嘉佳卡通", "北京卡酷", "金鹰卡通", "炫动卡通"};
    
        //新建一个私有变量用于保存用户设置的监听器
        private OnItemClickListener mOnItemClickListener = null;
    
        //set方法:
        public void setOnItemClickListener(OnItemClickListener listener) {
            this.mOnItemClickListener = listener;
        }
    
        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                //注意这里使用getTag方法获取position
                mOnItemClickListener.onItemClick(v,(int)v.getTag());
            }
        }
    
        //define interface 自定义一个接口
        public static interface OnItemClickListener {
            void onItemClick(View view, int position);
        }
    
        public ItemRecyclerViewAdapter(int pI){
            mHomes = new ArrayList<>();
            //holder.mView.setText(localTV[i]);
            if (pI == 0) {
                for (int i = 0; i < localTV.length; i++) {
                    mHome = new Home();
                    mHome.setName(localTV[i]);
                    mHomes.add(mHome);
                }
            }if (pI == 1) {
                for (int i = 0; i < cctv.length; i++) {
                    mHome = new Home();
                    mHome.setName(cctv[i]);
                    mHomes.add(mHome);
                }
            }if (pI == 2) {
                for (int i = 0; i < mLocal.length; i++) {
                    mHome = new Home();
                    mHome.setName(mLocal[i]);
                    mHomes.add(mHome);
                }
            }if (pI == 3) {
                for (int i = 0; i < mSports.length; i++) {
                    mHome = new Home();
                    mHome.setName(mSports[i]);
                    mHomes.add(mHome);
                }
            }if (pI == 4) {
                for (int i = 0; i < mMusic.length; i++) {
                    mHome = new Home();
                    mHome.setName(mMusic[i]);
                    mHomes.add(mHome);
                }
            }if (pI == 5) {
                for (int i = 0; i < mFilm.length; i++) {
                    mHome = new Home();
                    mHome.setName(mFilm[i]);
                    mHomes.add(mHome);
                }
            }if (pI == 6) {
                for (int i = 0; i < mCartoon.length; i++) {
                    mHome = new Home();
                    mHome.setName(mCartoon[i]);
                    mHomes.add(mHome);
                }
            }
    
        }
    
        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_home_head,null);
            //将创建的View注册点击事件
            view.setOnClickListener(this);
            return new MyViewHolder(view);
        }
    
        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {
            holder.mView.setText(mHomes.get(position).getName());
            //将position保存在itemView的Tag中,以便点击时进行获取
            holder.itemView.setTag(position);
        }
    
        @Override
        public int getItemCount() {
            return mHomes.size();
        }
    
        public class MyViewHolder extends RecyclerView.ViewHolder {
            TextView mView;
            public MyViewHolder(View itemView) {
                super(itemView);
                mView = itemView.findViewById(R.id.tv_name);
            }
        }
    }
    
    

    RecyclerView内层布局item_home_head.xml

    <?xml version="1.0" encoding="utf-8"?>
    <android.support.constraint.ConstraintLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
    
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <!--android:background="@drawable/beautiful_linearlayout_border"-->
        <TextView
            android:id="@+id/tv_name"
            android:layout_width="wrap_content"
            android:layout_height="48dp"
            android:layout_marginStart="0dp"
            android:layout_marginTop="0dp"
            android:gravity="center"
            android:text="TextView"
            android:textSize="19sp"
    
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toTopOf="parent" />
    
    </android.support.constraint.ConstraintLayout>
    
    展开全文
  • Android 动态添加view或item并获取数据

    万次阅读 多人点赞 2017-03-20 17:32:02
    最近在做一项目,项目中用到了一个功能,要求是动态Item,而且是多个的情况下,不过仔细的分析了下,都大同小异,做起来也很简单,在这里我只抽取出来做了一demo,也只做了一个动态添加item,同时可以获取所有添加和...

    最近在做一项目,项目中用到了一个功能,要求是动态Item,而且是多个的情况下,不过仔细的分析了下,都大同小异,做起来也很简单,在这里我只抽取出来做了一demo,也只做了一个动态添加item,同时可以获取所有添加和编辑Item上的数据,先上图:

    这里写图片描述

    我们先来分析一下这个demo:
    两个TextView和EditText,一个Button,一个星级评价RatingBar控件,布局完事…

    activity_dynamic的布局,有可能会添加多个,所以外面用ScrollView,因为我们是垂直方向添加,所以使用LinearLayout做容器

    <?xml version="1.0" encoding="utf-8"?>
    <ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
    
        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:orientation="vertical"
            android:padding="10dp">
    
            <LinearLayout
                android:id="@+id/ll_addView"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical" />
    
            <Button
                android:id="@+id/btn_getData"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/ll_addView"
                android:layout_marginTop="10dp"
                android:background="@drawable/em_btn_green_selector"
                android:text="获取数据" />
        </RelativeLayout>
    </ScrollView>

    再看看要添加的item_hotel_evaluate里面的布局:

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/rl_hotelName"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:background="@drawable/editbox_background_normal">
    
        <LinearLayout
            android:id="@+id/rl_addHotel"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal">
    
            <TextView
                android:id="@+id/tv_hotelName"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_marginLeft="5dp"
                android:layout_weight="1"
                android:text="酒店名称:"
                android:textSize="18sp" />
    
            <EditText
                android:id="@+id/ed_hotelName"
                android:layout_width="0dp"
                android:layout_height="wrap_content"
                android:layout_weight="2"
                android:background="@drawable/editbox_background_normal"
                android:padding="5dp"
                android:singleLine="true" />
    
            <Button
                android:id="@+id/btn_addHotel"
                android:layout_width="0dp"
                android:layout_height="30dp"
                android:layout_weight="1"
                android:background="@drawable/em_btn_green_selector"
                android:text="+新增"
                android:textColor="@color/white"
                android:textSize="18sp" />
        </LinearLayout>
    
        <LinearLayout
            android:id="@+id/ll_addHotelEvaluate"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/rl_addHotel"
            android:layout_marginTop="5dp"
            android:orientation="vertical">
    
            <RelativeLayout
                android:id="@+id/rl_hotelEvaluate"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/rl_addHotel"
                android:layout_marginTop="5dp"
                android:orientation="horizontal">
    
                <TextView
                    android:id="@+id/tv_hotelServer"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentStart="true"
                    android:layout_centerVertical="true"
                    android:layout_gravity="center_vertical"
                    android:layout_marginLeft="5dp"
                    android:layout_weight="1"
                    android:text="服务评价:"
                    android:textSize="18sp" />
    
                <RatingBar
                    android:id="@+id/rb_hotel_evaluate"
                    style="@style/myRatingBar"
                    android:layout_width="wrap_content"
                    android:layout_height="20dp"
                    android:layout_toRightOf="@+id/tv_hotelServer"
                    android:numStars="5"
                    android:rating="0"
                    android:stepSize="1.0" />
            </RelativeLayout>
    
            <EditText
                android:id="@+id/ed_hotelEvaluate"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_below="@+id/rl_server"
                android:background="@drawable/editbox_background_normal"
                android:singleLine="true" />
        </LinearLayout>
    </RelativeLayout>

    布局好了,因为Activity里面的代码写不是很多,直接上代码了,然后在最后分析一下:

    package com.bob.lucking.activity;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.util.Log;
    import android.view.View;
    import android.widget.Button;
    import android.widget.EditText;
    import android.widget.LinearLayout;
    import android.widget.RatingBar;
    
    import com.bob.lucking.R;
    
    /**
     * Created by bob on 2017/3/20.
     */
    
    public class DynamicAddViewActivity extends Activity implements View.OnClickListener {
    
        private String TAG = this.getClass().getSimpleName();
        //装在所有动态添加的Item的LinearLayout容器
        private LinearLayout addHotelNameView;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_dynamic);
            addHotelNameView = (LinearLayout) findViewById(R.id.ll_addView);
            findViewById(R.id.btn_getData).setOnClickListener(this);
    
            //默认添加一个Item
            addViewItem(null);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_addHotel://点击添加按钮就动态添加Item
                    addViewItem(v);
                    break;
                case R.id.btn_getData://打印数据
                    printData();
                    break;
            }
        }
    
        /**
         * Item排序
         */
        private void sortHotelViewItem() {
            //获取LinearLayout里面所有的view
            for (int i = 0; i < addHotelNameView.getChildCount(); i++) {
                final View childAt = addHotelNameView.getChildAt(i);
                final Button btn_remove = (Button) childAt.findViewById(R.id.btn_addHotel);
                btn_remove.setText("删除");
                btn_remove.setTag("remove");//设置删除标记
                btn_remove.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View v) {
                    //从LinearLayout容器中删除当前点击到的ViewItem
                      addHotelNameView.removeView(childAt);
                    }
                });
                //如果是最后一个ViewItem,就设置为添加
                if (i == (addHotelNameView.getChildCount() - 1)) {
                    Button btn_add = (Button) childAt.findViewById(R.id.btn_addHotel);
                    btn_add.setText("+新增");
                    btn_add.setTag("add");
                    btn_add.setOnClickListener(this);
                }
            }
        }
    
        //添加ViewItem
        private void addViewItem(View view) {
            if (addHotelNameView.getChildCount() == 0) {//如果一个都没有,就添加一个
                View hotelEvaluateView = View.inflate(this, R.layout.item_hotel_evaluate, null);
                Button btn_add = (Button) hotelEvaluateView.findViewById(R.id.btn_addHotel);
                btn_add.setText("+新增");
                btn_add.setTag("add");
                btn_add.setOnClickListener(this);
                addHotelNameView.addView(hotelEvaluateView);
                //sortHotelViewItem();
            } else if (((String) view.getTag()).equals("add")) {//如果有一个以上的Item,点击为添加的Item则添加
                View hotelEvaluateView = View.inflate(this, R.layout.item_hotel_evaluate, null);
                addHotelNameView.addView(hotelEvaluateView);
                sortHotelViewItem();
            } 
            //else {
              //  sortHotelViewItem();
            //}
        }
    
        //获取所有动态添加的Item,找到控件的id,获取数据
        private void printData() {
            for (int i = 0; i < addHotelNameView.getChildCount(); i++) {
                View childAt = addHotelNameView.getChildAt(i);
                EditText hotelName = (EditText) childAt.findViewById(R.id.ed_hotelName);
                RatingBar hotelEvaluateStart = (RatingBar) childAt.findViewById(R.id.rb_hotel_evaluate);
                EditText hotelEvaluate = (EditText) childAt.findViewById(R.id.ed_hotelEvaluate);
                Log.e(TAG, "酒店名称:" + hotelName.getText().toString() + "-----评价星数:"
                        + (int) hotelEvaluateStart.getRating() + "-----服务评价:" + hotelEvaluate.getText().toString());
            }
        }
    }
    

    最后我们来解读一下代码:
    onCreate里面初始化控件并设置事件,同时我们默认添加一条item,因为addHotelNameView容器初始化时里面没有子view,所以我们默认给添加的方法传null,

    在addViewItem方法时,里面有初始化并设置button方法,所以在onclick方法里面把事件的v传入是为了做标记,也就是设置tag,,在添加时会有两种情况:

    1. 如果只有一条,我们只能显示添加
    2. 有多条的情况下,如果点击的是设置有tag为add标记的添加,则添加

    如果点击删除,在sortHotelViewItem方法里面已经设置过删除点击事件,直接从内存中删除,
    最后是获取数据,我们可以通过LinearLayout容器来遍历addHotelNameView.getChildCount()获取所有添加的item,然后找到控件的id去获取所有添加的item数据。

    再这里注释一下:在addViewItem方法里面看到可以优化,上传资源时已经打包好了,现在在这里用单行注释掉了4行,添加第一个item时不需要排序的,还有就是else里面的是死代码,下载资源的朋友些可以删除这几行。

    需要源码的点击这里直接下载

    展开全文
  • android selector的item属性大全

    千次阅读 2016-09-05 17:16:56
    必须。必须是根元素。包含一个或多个元素。 Attributes: xmlns:android String,必须。定义XML的命名空间,必须是 “http://schemas.android.com/apk/res/android”.
  • Android selector的item里的属性说明

    千次阅读 2018-05-22 14:04:35
    Android UI设计中经常用到。比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到&lt;shape&gt;和&lt;selector&gt;。可以这样说,&lt;shape&gt;和&lt;selector&....
  • Android RecyclerView 实现item点击水波纹动画效果

    万次阅读 热门讨论 2018-06-22 21:12:38
    Recyclerview的item如果如果加上水波纹动画的点击效果会使列表的ui体验效果提升很多,今天来给大家介绍一下如何给Recyclerivew的item view添加这样的动画效果。 在res目录的drawable目录和drawable-v21下分别建立...
  • Android RecyclerView item按下变色效果

    千次阅读 2018-06-19 00:26:34
    适配器中item的布局文件android:background="@drawable/dianjibianyanse" 适配器代码中item的点击事件
  • 最近,项目中运用RecyclerView去实现item的删除和添加时的动画效果。 之前的想法是用RecyclerView本身的添加和删除的动画如下例子: RecyclerView recyclerView = (RecyclerView) findViewById(R.id.list); ...
  • Android—ListView Item 展开动画效果

    万次阅读 2015-08-14 16:00:24
    Android—ListView Item 展开动画效果 最近在做一个关于ListView item的展开效果,类似于 “粮仓” App 的商店页面,点击Item,展开显示子View,类似于ExpandableListView。如图: 其实原理大家都能够猜的到,...
  • android 改变listview的item宽高和让整个item布局居中显示的方式
  • 在你的Activity类中让Item居中的核心代码: final ListView listViewPointResults = findViewById(R.id.listViewPointResults); String[]ret = point.getResults();//这是我的字符串数组,将来要放到ListView中,也...
  • listView 的item点击切换的时候要实现切换的效果,文字 和右边的选中图形要呈现。 2.自己的分析: 要实现这种切换的效果,我第一时间想到的是用选择器,check属性,但是这里一个字体颜色要变,还要呈现右边的选择...
  • Android ListView:实现item内部控件的点击事件

    千次阅读 多人点赞 2018-03-15 17:57:51
    在使用ListView的时候,我们通常会使用到其item的点击事件。而有些时候我们可能会用到item内部控件的点击操作,比如在item内部有个Button,当点击该Button时,删除所在的item。 效果图如下图所示 「Talk is cheap....
  • 重写LayoutManger的onMeasure方法,这种方式可以获取到各个item的不同高度,从而可以设置变动的高度。在使用这种方式时,有一点需要注意的是,不要将RecyclerView的android:layout_height属性设置为wrap_content,...
  • Android 自定义ListView中的Item样式

    万次阅读 2015-08-25 16:43:24
    荒废许久的Android开发现在又重新开刀干了,发现还是很有激情坐下去的,也希望毕业之后找一份Android开发的工作吧,用博客来记录一下自己掉过的坑,这些东西不用的话,没过多久就会忘记,这不,又倒回来看ListView,...
  • 今天简单用缓存优化方式实现了listview的功能,下面让...首先,我们考虑一下该如何实现listview中item的圆角效果呢?  1. 想法一:通过最普遍的方式-- shape属性定义来实现 这种方式需要在drawable目录下创建sh
  • 最近项目中用到了gridview,顺带对gridview的item与子控件焦点问题进行小小的研究比较下; 项目需求:在simphone手持把枪上通过方向按钮实现gridview的菜单选择; 实现方法1:在子布局中写入button的background...
  • item的xml文件如下: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orienta
  • Android listview 点击Item更换背景颜色

    千次阅读 2017-07-21 11:16:41
    效果图: 思路:声明一个变量index来记录当前的行,然后设置Item的点击监听,点击的时候更新index为当前点击的Item下标,然后刷新...listView Item的样式 xml 代码截图: java类代码,声明一个变量来记录当前点击的
  • 怎么才能实现自适应 网上好多方法都不靠谱 。。。。。。。。。。。。。。。。。。
  • 场景:istview中有n个item,每个item中有一个按钮(显示详细信息),当点击这个按钮是,item高度自动增加,并显示详细内容。
  • 我遇到一个项目要求在listview的item包含拍照按钮,数据提交按钮,数据输入等,这时我就发愁了,怎么去实现具体的功能,如拍照,拍照返回显示的图片不要串行等,遇到了好多问题,这儿就以这个为例给大家讲一下。...
  • Android RecyclerView之添加Item分割线

    万次阅读 2015-10-28 21:46:22
    Android RecyclerView之代替ListView与GridView 这篇博客中,布局中可以看到虽然实现了ListView 与GridView的布局的实现,但是如果不加背景颜色,每个Item间是没有分割线的,因此分割线的添加需要我们自己进行...
  • 先瞅眼==>↓ImageView和item的高度 都是WRAP_CONTENT闲来没事,准备鼓捣一下RedcyclerView, 话不多说直接进题↓ RecyclerViewm瀑布流网上很多,就不多说了,但是我网上搜索到的item高度全部都是随机数,并没有能够...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 308,347
精华内容 123,338
关键字:

androiditem

友情链接: SDProtocolChinese.rar