小生功能贴<一> --- 动态添加应用 具有长按删除功能
---恢复内容开始---
动态添加应用 具有长按删除功能 功能如下图:
(图片显示功能不是你要的,那就默默关闭页面吧)
设计思路:
页面一:用girdview网格显示图标,在自定义的adapter中为每一个子Item添加内容并且加上点击事件(长按和短按),“+”button跳转到第二个页面。
页面二:用AutoCompeleteTextView带提示的输入框,用adapter为其添加提示字符串组,确认显示所搜索到的应用,这里显示搜索到的应用我不是用ListView,而是在代码中动态添加布局,每一次按“搜索”前先清空里面的子布局。按”添加“后判断该应用是否已经添加,没有的话就在页面一加上,并且返回页面一。
注意:数据我是用常量类Constant,没有介入SQL,只为测试方便。判断当前是否是长按状态下我用Constant.press进行标记。
下面贴上代码童鞋们一起玩玩。
- package com.example.practice1;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.Timer;
- import android.app.Activity;
- import android.app.ActionBar;
- import android.app.Fragment;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.os.SystemClock;
- import android.util.Log;
- import android.view.LayoutInflater;
- import android.view.Menu;
- import android.view.MenuItem;
- import android.view.MotionEvent;
- import android.view.View;
- import android.view.View.OnClickListener;
- import android.view.View.OnLongClickListener;
- import android.view.View.OnTouchListener;
- import android.view.ViewGroup;
- import android.widget.AdapterView;
- import android.widget.AdapterView.OnItemClickListener;
- import android.widget.BaseAdapter;
- import android.widget.Chronometer;
- import android.widget.GridView;
- import android.widget.ImageView;
- import android.widget.SimpleAdapter;
- import android.widget.TextView;
- import android.widget.Toast;
- import android.os.Build;
- public class MainActivity extends Activity {
- Grid_Adapter adp;
- GridView gridview;
- long startMili=0;
- long endMili=0;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.main);
- gridview = (GridView) findViewById(R.id.gridview);
- adp=new Grid_Adapter(this,Constant.num);
- //添加并且显示
- gridview.setAdapter(adp);
- }
- @Override
- public void onBackPressed() { //长按后 不想删除 按返回键的触发事件
- if(!Constant.press)
- finish();
- else {
- String st;
- for(int k=12;k<Constant.num-1;k++){st=Constant.text[k];
- if(st.equals("微信")){Constant.image[k]=R.drawable.weixin_press;}
- if(st.equals("微博")){Constant.image[k]=R.drawable.weibo_press;}
- if(st.equals("酷狗音乐")){Constant.image[k]=R.drawable.kugou_press;}
- if(st.equals("华农宝")){Constant.image[k]=R.drawable.huanongbao_press;}
- if(st.equals("QQ")){Constant.image[k]=R.drawable.qq_press;}
- if(st.equals("飞信")){Constant.image[k]=R.drawable.feixin_press;}
- }
- Constant.press=false;
- Constant.num++;
- Constant.image[Constant.num-1]=R.drawable.image13;
- Constant.text[Constant.num-1]="13";
- for(int i=0;i<Constant.num;i++){
- Log.v("num",Constant.text[i]);
- }
- adp.notifyDataSetChanged();//更新
- }
- }
- private class appClick implements OnTouchListener{ //子Item的OnTouch触发事件
- int position;
- public appClick(int position) {
- // TODO Auto-generated constructor stub
- this.position=position;
- }
- @Override
- public boolean onTouch(View arg0, MotionEvent event) {
- // TODO Auto-generated method stub
- if(event.getAction() == MotionEvent.ACTION_UP){
- Log.v("s","抬起");
- endMili=System.currentTimeMillis();// 当前时间对应的毫秒数
- long Time = endMili-startMili; //时间差
- Log.v("time",Long.toString(Time));
- if(Time>1000){ //根据时间差来判断是短按还是长按,这里标准时一秒
- Log.v("long","long_out");appLongClick(position);}
- else {
- Log.v("short","short_out");appShortClick(position);}
- }
- if(event.getAction() == MotionEvent.ACTION_DOWN){
- startMili=System.currentTimeMillis();// 当前时间对应的毫秒数
- Log.v("q","按下");
- }
- return true;
- }
- }
- private void appShortClick(int p){ //短按处理
- int position=p;
- Log.v("short","short_in");
- if(Constant.press){
- Log.v("ee","eee");
- for(int k=position;k<Constant.num-1;k++){
- Constant.image[k]=Constant.image[k+1];
- Constant.text[k]=Constant.text[k+1];
- }
- Log.v("shit",Constant.text[Constant.num-1]);
- Constant.press=true;
- Constant.image[Constant.num-1]=R.drawable.image13;
- Constant.text[Constant.num-1]="13";
- if(Constant.num!=13)
- {Constant.num--;}else {Constant.press=false;}
- Log.v("d",Integer.toString(Constant.num));
- adp.notifyDataSetChanged();
- //更新
- }else if(!Constant.press&&p==Constant.num-1){
- Intent intent =new Intent();
- intent.setClass(MainActivity.this, AddApplication.class);
- startActivity(intent);
- finish();
- }
- }
- private void appLongClick(int p){ //长按处理
- if(!Constant.press&&p==Constant.num-1){}
- else{
- String st;
- for(int k=12;k<Constant.num-1;k++){st=Constant.text[k];
- if(st.equals("微信")){Constant.image[k]=R.drawable.weixin_press;}
- if(st.equals("微博")){Constant.image[k]=R.drawable.weibo_press;}
- if(st.equals("酷狗音乐")){Constant.image[k]=R.drawable.kugou_press;}
- if(st.equals("华农宝")){Constant.image[k]=R.drawable.huanongbao_press;}
- if(st.equals("QQ")){Constant.image[k]=R.drawable.qq_press;}
- if(st.equals("飞信")){Constant.image[k]=R.drawable.feixin_press;}
- }
- Constant.press=true;
- Constant.num--;
- adp.notifyDataSetChanged();//更新
- }
- }
- class Grid_Adapter extends BaseAdapter{ //GridView的自定义adapter
- Context mContext;
- public Grid_Adapter(Context context,int num){
- mContext=context;
- }
- @Override
- public int getCount() {
- // TODO Auto-generated method stub
- return Constant.num;
- }
- @Override
- public Object getItem(int arg0) {
- // TODO Auto-generated method stub
- return Constant.image[arg0];
- }
- @Override
- public long getItemId(int arg0) {
- // TODO Auto-generated method stub
- return arg0;
- }
- @Override
- public View getView(int position, View arg1, ViewGroup arg2) {
- // TODO Auto-generated method stub
- LayoutInflater inflater = LayoutInflater.from(mContext);
- View view = null;
- view = inflater.inflate(R.layout.grid_adapter, null);
- ImageView im=(ImageView)view.findViewById(R.id.ItemImage);
- TextView te=(TextView)view.findViewById(R.id.ItemText);
- im.setBackgroundResource((int)getItem(position));
- te.setText(Constant.text[position]);
- if(position>11&&position<=Constant.num-1){
- view.setOnTouchListener(new appClick(position));
- }
- return view;
- }}
- }
MainActivity的XML布局文件就一个GiewView,这里就不贴了。
- package com.example.practice1;
- import android.app.Activity;
- import android.content.Intent;
- import android.os.Bundle;
- import android.text.Editable;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.widget.ArrayAdapter;
- import android.widget.AutoCompleteTextView;
- import android.widget.Button;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- import android.widget.Toast;
- public class AddApplication extends Activity{
- AutoCompleteTextView autotext;
- Button bu_se;
- LinearLayout app_add;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- // TODO Auto-generated method stub
- super.onCreate(savedInstanceState);
- setContentView(R.layout.addapplication);
- autotext=(AutoCompleteTextView)findViewById(R.id.autotext);
- ArrayAdapter<String> adapter=new ArrayAdapter<String>(
- this,android.R.layout.simple_dropdown_item_1line,Constant.application);
- autotext.setAdapter(adapter);
- bu_se=(Button)findViewById(R.id.bu_search);
- bu_se.setOnClickListener(new View.OnClickListener() { //搜索按钮的触发事件
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- Editable st;
- st=autotext.getText();
- String str=st.toString();
- view(str);
- }
- });
- }
- @Override
- public void onBackPressed() { //按返回键回到第一个页面
- Intent intent =new Intent(AddApplication.this,MainActivity.class);
- startActivity(intent);
- finish();
- }
- public void view(String str){ //按下搜索后显示应用
- LinearLayout app_add=(LinearLayout)findViewById(R.id.list_app); //先清空list_app的子布局
- int count = app_add.getChildCount();
- while(count-1>=0){app_add.removeViewAt(count-1);count--;}
- LayoutInflater inflater = LayoutInflater.from(this);
- int i=0;
- for(i=0;i<Constant.application.length;i++){ //把输入字符串与现存所有应用名进行匹配
- final int position =i;
- if(Constant.application[i].indexOf(str)!=-1){
- View view_0 = inflater.inflate(R.layout.list_view, null);
- TextView app_name = (TextView)view_0.findViewById(R.id.app_name);
- ImageView app_image= (ImageView)view_0.findViewById(R.id.app_icon);
- Button bu_add =(Button)view_0.findViewById(R.id.app_add);
- app_name.setText(Constant.application[i]);
- app_image.setBackgroundResource(Constant.app_icon[i]);
- bu_add.setOnClickListener(new View.OnClickListener() { //为添加按钮设置监控
- @Override
- public void onClick(View arg0) {
- // TODO Auto-generated method stub
- if(verification(position)){ //如果未添加过该应用则在第一个页面添加并返回第一个页面
- Constant.image[Constant.num]=Constant.image[Constant.num-1];
- Constant.text[Constant.num]=Constant.text[Constant.num-1];
- Constant.image[Constant.num-1]=Constant.app_icon[position];
- Constant.text[Constant.num-1]=Constant.application[position];
- Constant.num++;
- Intent intent =new Intent();
- intent.setClass(AddApplication.this, MainActivity.class);
- startActivity(intent);
- finish();
- }else{
- Toast.makeText(AddApplication.this, "该应用你已添加>.<",
- Toast.LENGTH_SHORT).show();
- }
- }
- });
- app_add.addView(view_0); //往list_app添加子Item
- }
- }
- }
- private boolean verification(int p){
- for(int i=0;i<Constant.image.length;i++){
- if(Constant.application[p].equals(Constant.text[i])){
- return false;
- }
- }
- return true;
- }
- }
Constant,用来保存测试数据
- package com.example.practice1;
- public class Constant {
- public static boolean press = false;
- public static int num=13;
- public static int[] image={R.drawable.image1,
- R.drawable.image2,R.drawable.image3,R.drawable.image4,R.drawable.image5,
- R.drawable.image6,R.drawable.image7,R.drawable.image8,R.drawable.image9,
- R.drawable.image10,R.drawable.image11,R.drawable.image12,R.drawable.image13,0,0,0,0,0,0,0};
- public static String[] text={"1","2","3","4","5","6","7","8","9","10","11","12","13","0","0","0","0","0","0","0"};
- public static String[] application ={"微信","QQ","华农宝","飞信","微博","酷狗音乐"};
- public static int[] app_icon={R.drawable.weixin,R.drawable.qq,R.drawable.huanongbao,R.drawable.feixin,R.drawable.weibo,R.drawable.kugou};
- }
最后是三个XML
grid_adapter.XML
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:orientation="vertical"
- android:gravity="center_horizontal" >
- <ImageView
- android:layout_height="wrap_content"
- android:id="@+id/ItemImage"
- android:layout_width="wrap_content"
- >
- </ImageView>
- <TextView
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:text="TextView01"
- android:gravity="center"
- android:id="@+id/ItemText">
- </TextView>
- </LinearLayout>
list_view
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginTop="5px"
- android:layout_marginLeft="5px"
- android:layout_marginRight="5px"
- android:orientation="horizontal" >
- <LinearLayout
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="7"
- android:orientation="horizontal"
- >
- <ImageView
- android:layout_marginLeft="2px"
- android:layout_marginTop="2px"
- android:layout_marginBottom="2px"
- android:layout_marginRight="2px"
- android:id="@+id/app_icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- <TextView
- android:id="@+id/app_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:gravity="center"
- />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="3"
- android:orientation="horizontal"
- >
- <Button
- android:layout_marginLeft="2px"
- android:layout_marginTop="2px"
- android:layout_marginBottom="2px"
- android:layout_marginRight="2px"
- android:id="@+id/app_add"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="添加"
- />
- </LinearLayout>
- </LinearLayout>
addapplication.XML
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- android:layout_marginTop="5px"
- android:layout_marginLeft="5px"
- android:layout_marginRight="5px"
- android:orientation="horizontal" >
- <LinearLayout
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="7"
- android:orientation="horizontal"
- >
- <ImageView
- android:layout_marginLeft="2px"
- android:layout_marginTop="2px"
- android:layout_marginBottom="2px"
- android:layout_marginRight="2px"
- android:id="@+id/app_icon"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- />
- <TextView
- android:id="@+id/app_name"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_gravity="center_horizontal"
- android:gravity="center"
- />
- </LinearLayout>
- <LinearLayout
- android:layout_width="0px"
- android:layout_height="wrap_content"
- android:layout_weight="3"
- android:orientation="horizontal"
- >
- <Button
- android:layout_marginLeft="2px"
- android:layout_marginTop="2px"
- android:layout_marginBottom="2px"
- android:layout_marginRight="2px"
- android:id="@+id/app_add"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:text="添加"
- />
- </LinearLayout>
- </LinearLayout>
最后附上源码,有需要的请留言留下你的邮箱,供嫌长的童鞋学习学习= = ~
有问题请留言
小生功能贴<一> --- 动态添加应用 具有长按删除功能的更多相关文章
- JS自定义功能函数实现动态添加网址参数修改网址参数值
无论是前端开发还是后台设计,很多时候开发人员都需要获取当前或目标网址的相关信息.这个已有现成的内置对象属性可以直接调用了(下面是获取当前页面的参考代码) 复制代码 代码如下: <script t ...
- winfrom 动态添加控件,以及删除
private void btnadd_Click(object sender, EventArgs e) { int fileCount = 0; ...
- GrideVlew提供点击按钮添加新数据,单击项目修改,长按删除功能
package com.example.wang.myapplication; import android.app.AlertDialog; import android.content.Dialo ...
- 点击按钮添加一行,和本行的删除功能,序号变动,name属性更改
<!--html结构--> <div> <input type="button" value="添加一行" onclick=&qu ...
- vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能
vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...
- Android仿qq聊天记录长按删除功能效果
最近项目在做IM即时通讯开发,在删除聊天列表的时候跟删除聊天详细信息的时候,产品经理想要跟ios一样,在当前选中行上方弹出一个删除窗口.于是先从网上找demo,找了一个发现是Dialog做的,我感觉没 ...
- day_5.26python动态添加属性和方法
python动态添加属性和方法 既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx ,那么给对象添加⼀个⽅法 也是类似的 对象.⽅法名 = xxx '''2018-5-26 13:40:09pyth ...
- ASP.NET给Table动态添加删除行,并且得到控件的值
ASP.NET给Table动态添加控件并且得到控件的值 由于跟老师做一个小的项目,可是我自己又不太懂js,所以一直为动态建立表格并且能动态的取值和赋值感到苦恼.起初在网上找到了一些js资源,解决了动态 ...
- AngularJS:实现动态添加输入控件功能
功能要求如下:1. 点击加号可以增加输入框.2. 点击减号可以减少输入框.3. 当输入框只有一个的时候,不能再减少输入框.效果图如下:只有一个输入框有多个输入框 要实现这个功能,可以 ...
随机推荐
- Unity3D音乐音效学习笔记
对于Unity3D的音乐音效这块一直没有好好的看过,现在准备好好的研究一下,并作为一个笔记记录下. 支持格式 在游戏中,一般存在两种音乐,一种是时间较长的背景音乐,一种是时间较短的音效(比如按钮点击, ...
- C#中的强制类型转换与as转换的区别
C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA(); ClassB b = new ClassB(); 如果 ...
- 如何使用C#去灰度化一幅图像
灰度化一幅图像就是将图像的色彩信息全部丢掉,将24位的位图信息,用8位来表示,灰度图共有256级灰度等级,也就是将24位位图的一点如(255,255,255)转换成255,所以R,G,B三个值所乘的系 ...
- Winform开发框架之权限管理系统
本文章转载:http://www.cnblogs.com/wuhuacong/archive/2011/05/08/2040620.html 至此,权限管理模块介绍已经完毕,下面给出一个调用例子Dem ...
- Javascript可变长度参数列表 - Arguments对象
在一个函数体内,标识符arguments具有特殊含义. Arguments对象是一个类似数组的对象 eg: 验证函数参数的正确数目 function f(x, y, z) { if (argument ...
- URAL 1780 G - Gray Code 找规律
G - Gray CodeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...
- C语言经典算法100例(二)
11.判断某一年是否是闰年. //判断某一年份是否是闰年 int IsLeapYear(int year) { return (year % 400 == 0 || (year % 4 == 0) & ...
- ${var}变量替换
${age},${name} 给定一个上下文 Map<String,String> context 使用上下文替换变量private static final Pattern VAR_PA ...
- Keeplived 详解
http://www.cnblogs.com/pricks/p/3822232.html
- 实例源码--Android简单音乐播放器源码
下载源码 技术要点: 1.本地音乐管理 2.在线音乐听歌.下载 3.音频流的解码 4. HTTP通信模块 5. Sqlite数据库 6. 源码带详细的中文注释 ...... 详细介绍: 1.本 ...