---恢复内容开始---

动态添加应用 具有长按删除功能 功能如下图:

              

(图片显示功能不是你要的,那就默默关闭页面吧)

设计思路:

  页面一:用girdview网格显示图标,在自定义的adapter中为每一个子Item添加内容并且加上点击事件(长按和短按),“+”button跳转到第二个页面。

  页面二:用AutoCompeleteTextView带提示的输入框,用adapter为其添加提示字符串组,确认显示所搜索到的应用,这里显示搜索到的应用我不是用ListView,而是在代码中动态添加布局,每一次按“搜索”前先清空里面的子布局。按”添加“后判断该应用是否已经添加,没有的话就在页面一加上,并且返回页面一。

  注意:数据我是用常量类Constant,没有介入SQL,只为测试方便。判断当前是否是长按状态下我用Constant.press进行标记。

下面贴上代码童鞋们一起玩玩。

  

  1. package com.example.practice1;
  2.  
  3. import java.util.ArrayList;
  4. import java.util.HashMap;
  5. import java.util.Timer;
  6.  
  7. import android.app.Activity;
  8. import android.app.ActionBar;
  9. import android.app.Fragment;
  10. import android.content.Context;
  11. import android.content.Intent;
  12. import android.os.Bundle;
  13. import android.os.SystemClock;
  14. import android.util.Log;
  15. import android.view.LayoutInflater;
  16. import android.view.Menu;
  17. import android.view.MenuItem;
  18. import android.view.MotionEvent;
  19. import android.view.View;
  20. import android.view.View.OnClickListener;
  21. import android.view.View.OnLongClickListener;
  22. import android.view.View.OnTouchListener;
  23. import android.view.ViewGroup;
  24. import android.widget.AdapterView;
  25. import android.widget.AdapterView.OnItemClickListener;
  26. import android.widget.BaseAdapter;
  27. import android.widget.Chronometer;
  28. import android.widget.GridView;
  29. import android.widget.ImageView;
  30. import android.widget.SimpleAdapter;
  31. import android.widget.TextView;
  32. import android.widget.Toast;
  33. import android.os.Build;
  34.  
  35. public class MainActivity extends Activity {
  36.  
  37. Grid_Adapter adp;
  38. GridView gridview;
  39. long startMili=0;
  40. long endMili=0;
  41. @Override
  42. protected void onCreate(Bundle savedInstanceState) {
  43. super.onCreate(savedInstanceState);
  44. setContentView(R.layout.main);
  45. gridview = (GridView) findViewById(R.id.gridview);
  46. adp=new Grid_Adapter(this,Constant.num);
  47. //添加并且显示
  48. gridview.setAdapter(adp);
  49.  
  50. }
  51.  
  52. @Override
  53. public void onBackPressed() { //长按后 不想删除 按返回键的触发事件
  54. if(!Constant.press)
  55. finish();
  56. else {
  57. String st;
  58.  
  59. for(int k=12;k<Constant.num-1;k++){st=Constant.text[k];
  60. if(st.equals("微信")){Constant.image[k]=R.drawable.weixin_press;}
  61. if(st.equals("微博")){Constant.image[k]=R.drawable.weibo_press;}
  62. if(st.equals("酷狗音乐")){Constant.image[k]=R.drawable.kugou_press;}
  63. if(st.equals("华农宝")){Constant.image[k]=R.drawable.huanongbao_press;}
  64. if(st.equals("QQ")){Constant.image[k]=R.drawable.qq_press;}
  65. if(st.equals("飞信")){Constant.image[k]=R.drawable.feixin_press;}
  66. }
  67. Constant.press=false;
  68. Constant.num++;
  69. Constant.image[Constant.num-1]=R.drawable.image13;
  70. Constant.text[Constant.num-1]="13";
  71. for(int i=0;i<Constant.num;i++){
  72. Log.v("num",Constant.text[i]);
  73. }
  74. adp.notifyDataSetChanged();//更新
  75. }
  76. }
  77.  
  78. private class appClick implements OnTouchListener{ //子Item的OnTouch触发事件
  79. int position;
  80. public appClick(int position) {
  81. // TODO Auto-generated constructor stub
  82. this.position=position;
  83. }
  84.  
  85. @Override
  86. public boolean onTouch(View arg0, MotionEvent event) {
  87. // TODO Auto-generated method stub
  88.  
  89. if(event.getAction() == MotionEvent.ACTION_UP){
  90. Log.v("s","抬起");
  91.  
  92. endMili=System.currentTimeMillis();// 当前时间对应的毫秒数
  93.  
  94. long Time = endMili-startMili; //时间差
  95. Log.v("time",Long.toString(Time));
  96.  
  97. if(Time>1000){ //根据时间差来判断是短按还是长按,这里标准时一秒
  98. Log.v("long","long_out");appLongClick(position);}
  99. else {
  100. Log.v("short","short_out");appShortClick(position);}
  101. }
  102.  
  103. if(event.getAction() == MotionEvent.ACTION_DOWN){
  104. startMili=System.currentTimeMillis();// 当前时间对应的毫秒数
  105. Log.v("q","按下");
  106. }
  107. return true;
  108. }
  109.  
  110. }
  111.  
  112. private void appShortClick(int p){ //短按处理
  113. int position=p;
  114. Log.v("short","short_in");
  115. if(Constant.press){
  116. Log.v("ee","eee");
  117. for(int k=position;k<Constant.num-1;k++){
  118. Constant.image[k]=Constant.image[k+1];
  119. Constant.text[k]=Constant.text[k+1];
  120. }
  121. Log.v("shit",Constant.text[Constant.num-1]);
  122. Constant.press=true;
  123. Constant.image[Constant.num-1]=R.drawable.image13;
  124. Constant.text[Constant.num-1]="13";
  125. if(Constant.num!=13)
  126. {Constant.num--;}else {Constant.press=false;}
  127. Log.v("d",Integer.toString(Constant.num));
  128. adp.notifyDataSetChanged();
  129. //更新
  130. }else if(!Constant.press&&p==Constant.num-1){
  131. Intent intent =new Intent();
  132. intent.setClass(MainActivity.this, AddApplication.class);
  133. startActivity(intent);
  134. finish();
  135. }
  136.  
  137. }
  138. private void appLongClick(int p){ //长按处理
  139.  
  140. if(!Constant.press&&p==Constant.num-1){}
  141. else{
  142. String st;
  143. for(int k=12;k<Constant.num-1;k++){st=Constant.text[k];
  144. if(st.equals("微信")){Constant.image[k]=R.drawable.weixin_press;}
  145. if(st.equals("微博")){Constant.image[k]=R.drawable.weibo_press;}
  146. if(st.equals("酷狗音乐")){Constant.image[k]=R.drawable.kugou_press;}
  147. if(st.equals("华农宝")){Constant.image[k]=R.drawable.huanongbao_press;}
  148. if(st.equals("QQ")){Constant.image[k]=R.drawable.qq_press;}
  149. if(st.equals("飞信")){Constant.image[k]=R.drawable.feixin_press;}
  150. }
  151.  
  152. Constant.press=true;
  153. Constant.num--;
  154. adp.notifyDataSetChanged();//更新
  155. }
  156. }
  157.  
  158. class Grid_Adapter extends BaseAdapter{ //GridView的自定义adapter
  159. Context mContext;
  160. public Grid_Adapter(Context context,int num){
  161. mContext=context;
  162.  
  163. }
  164. @Override
  165. public int getCount() {
  166. // TODO Auto-generated method stub
  167. return Constant.num;
  168. }
  169.  
  170. @Override
  171. public Object getItem(int arg0) {
  172. // TODO Auto-generated method stub
  173. return Constant.image[arg0];
  174. }
  175.  
  176. @Override
  177. public long getItemId(int arg0) {
  178. // TODO Auto-generated method stub
  179. return arg0;
  180. }
  181.  
  182. @Override
  183. public View getView(int position, View arg1, ViewGroup arg2) {
  184. // TODO Auto-generated method stub
  185.  
  186. LayoutInflater inflater = LayoutInflater.from(mContext);
  187. View view = null;
  188. view = inflater.inflate(R.layout.grid_adapter, null);
  189. ImageView im=(ImageView)view.findViewById(R.id.ItemImage);
  190.  
  191. TextView te=(TextView)view.findViewById(R.id.ItemText);
  192.  
  193. im.setBackgroundResource((int)getItem(position));
  194. te.setText(Constant.text[position]);
  195.  
  196. if(position>11&&position<=Constant.num-1){
  197.  
  198. view.setOnTouchListener(new appClick(position));
  199.  
  200. }
  201.  
  202. return view;
  203.  
  204. }}
  205. }

MainActivity的XML布局文件就一个GiewView,这里就不贴了。

  1. package com.example.practice1;
  2.  
  3. import android.app.Activity;
  4. import android.content.Intent;
  5. import android.os.Bundle;
  6. import android.text.Editable;
  7. import android.view.LayoutInflater;
  8. import android.view.View;
  9. import android.widget.ArrayAdapter;
  10. import android.widget.AutoCompleteTextView;
  11. import android.widget.Button;
  12. import android.widget.ImageView;
  13. import android.widget.LinearLayout;
  14. import android.widget.TextView;
  15. import android.widget.Toast;
  16.  
  17. public class AddApplication extends Activity{
  18. AutoCompleteTextView autotext;
  19. Button bu_se;
  20. LinearLayout app_add;
  21. @Override
  22. protected void onCreate(Bundle savedInstanceState) {
  23. // TODO Auto-generated method stub
  24. super.onCreate(savedInstanceState);
  25. setContentView(R.layout.addapplication);
  26. autotext=(AutoCompleteTextView)findViewById(R.id.autotext);
  27. ArrayAdapter<String> adapter=new ArrayAdapter<String>(
  28. this,android.R.layout.simple_dropdown_item_1line,Constant.application);
  29. autotext.setAdapter(adapter);
  30.  
  31. bu_se=(Button)findViewById(R.id.bu_search);
  32. bu_se.setOnClickListener(new View.OnClickListener() { //搜索按钮的触发事件
  33.  
  34. @Override
  35. public void onClick(View arg0) {
  36. // TODO Auto-generated method stub
  37. Editable st;
  38. st=autotext.getText();
  39. String str=st.toString();
  40. view(str);
  41. }
  42. });
  43. }
  44. @Override
  45. public void onBackPressed() { //按返回键回到第一个页面
  46. Intent intent =new Intent(AddApplication.this,MainActivity.class);
  47. startActivity(intent);
  48. finish();
  49. }
  50. public void view(String str){ //按下搜索后显示应用
  51. LinearLayout app_add=(LinearLayout)findViewById(R.id.list_app); //先清空list_app的子布局
  52. int count = app_add.getChildCount();
  53. while(count-1>=0){app_add.removeViewAt(count-1);count--;}
  54.  
  55. LayoutInflater inflater = LayoutInflater.from(this);
  56. int i=0;
  57. for(i=0;i<Constant.application.length;i++){ //把输入字符串与现存所有应用名进行匹配
  58. final int position =i;
  59. if(Constant.application[i].indexOf(str)!=-1){
  60. View view_0 = inflater.inflate(R.layout.list_view, null);
  61. TextView app_name = (TextView)view_0.findViewById(R.id.app_name);
  62. ImageView app_image= (ImageView)view_0.findViewById(R.id.app_icon);
  63. Button bu_add =(Button)view_0.findViewById(R.id.app_add);
  64. app_name.setText(Constant.application[i]);
  65. app_image.setBackgroundResource(Constant.app_icon[i]);
  66. bu_add.setOnClickListener(new View.OnClickListener() { //为添加按钮设置监控
  67.  
  68. @Override
  69. public void onClick(View arg0) {
  70. // TODO Auto-generated method stub
  71. if(verification(position)){ //如果未添加过该应用则在第一个页面添加并返回第一个页面
  72. Constant.image[Constant.num]=Constant.image[Constant.num-1];
  73. Constant.text[Constant.num]=Constant.text[Constant.num-1];
  74. Constant.image[Constant.num-1]=Constant.app_icon[position];
  75. Constant.text[Constant.num-1]=Constant.application[position];
  76. Constant.num++;
  77. Intent intent =new Intent();
  78. intent.setClass(AddApplication.this, MainActivity.class);
  79. startActivity(intent);
  80. finish();
  81. }else{
  82. Toast.makeText(AddApplication.this, "该应用你已添加>.<",
  83. Toast.LENGTH_SHORT).show();
  84. }
  85.  
  86. }
  87. });
  88.  
  89. app_add.addView(view_0); //往list_app添加子Item
  90. }
  91.  
  92. }
  93.  
  94. }
  95. private boolean verification(int p){
  96. for(int i=0;i<Constant.image.length;i++){
  97. if(Constant.application[p].equals(Constant.text[i])){
  98. return false;
  99. }
  100. }
  101. return true;
  102. }
  103. }

Constant,用来保存测试数据

  1. package com.example.practice1;
  2.  
  3. public class Constant {
  4. public static boolean press = false;
  5. public static int num=13;
  6. public static int[] image={R.drawable.image1,
  7. R.drawable.image2,R.drawable.image3,R.drawable.image4,R.drawable.image5,
  8. R.drawable.image6,R.drawable.image7,R.drawable.image8,R.drawable.image9,
  9. R.drawable.image10,R.drawable.image11,R.drawable.image12,R.drawable.image13,0,0,0,0,0,0,0};
  10.  
  11. public static String[] text={"1","2","3","4","5","6","7","8","9","10","11","12","13","0","0","0","0","0","0","0"};
  12. public static String[] application ={"微信","QQ","华农宝","飞信","微博","酷狗音乐"};
  13. public static int[] app_icon={R.drawable.weixin,R.drawable.qq,R.drawable.huanongbao,R.drawable.feixin,R.drawable.weibo,R.drawable.kugou};
  14.  
  15. }

最后是三个XML

grid_adapter.XML

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="wrap_content"
  4. android:layout_height="wrap_content"
  5. android:orientation="vertical"
  6. android:gravity="center_horizontal" >
  7. <ImageView
  8. android:layout_height="wrap_content"
  9. android:id="@+id/ItemImage"
  10. android:layout_width="wrap_content"
  11.  
  12. >
  13.  
  14. </ImageView>
  15. <TextView
  16. android:layout_width="match_parent"
  17. android:layout_height="wrap_content"
  18. android:text="TextView01"
  19. android:gravity="center"
  20. android:id="@+id/ItemText">
  21. </TextView>
  22.  
  23. </LinearLayout>

  list_view

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:layout_marginTop="5px"
  6. android:layout_marginLeft="5px"
  7. android:layout_marginRight="5px"
  8. android:orientation="horizontal" >
  9. <LinearLayout
  10. android:layout_width="0px"
  11. android:layout_height="wrap_content"
  12. android:layout_weight="7"
  13. android:orientation="horizontal"
  14. >
  15. <ImageView
  16. android:layout_marginLeft="2px"
  17. android:layout_marginTop="2px"
  18. android:layout_marginBottom="2px"
  19. android:layout_marginRight="2px"
  20. android:id="@+id/app_icon"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23.  
  24. />
  25. <TextView
  26. android:id="@+id/app_name"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:layout_gravity="center_horizontal"
  30. android:gravity="center"
  31. />
  32. </LinearLayout>
  33. <LinearLayout
  34. android:layout_width="0px"
  35. android:layout_height="wrap_content"
  36. android:layout_weight="3"
  37. android:orientation="horizontal"
  38. >
  39. <Button
  40. android:layout_marginLeft="2px"
  41. android:layout_marginTop="2px"
  42. android:layout_marginBottom="2px"
  43. android:layout_marginRight="2px"
  44. android:id="@+id/app_add"
  45. android:layout_width="wrap_content"
  46. android:layout_height="wrap_content"
  47. android:text="添加"
  48.  
  49. />
  50. </LinearLayout>
  51. </LinearLayout>

  addapplication.XML

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"
  5. android:layout_marginTop="5px"
  6. android:layout_marginLeft="5px"
  7. android:layout_marginRight="5px"
  8. android:orientation="horizontal" >
  9. <LinearLayout
  10. android:layout_width="0px"
  11. android:layout_height="wrap_content"
  12. android:layout_weight="7"
  13. android:orientation="horizontal"
  14. >
  15. <ImageView
  16. android:layout_marginLeft="2px"
  17. android:layout_marginTop="2px"
  18. android:layout_marginBottom="2px"
  19. android:layout_marginRight="2px"
  20. android:id="@+id/app_icon"
  21. android:layout_width="wrap_content"
  22. android:layout_height="wrap_content"
  23.  
  24. />
  25. <TextView
  26. android:id="@+id/app_name"
  27. android:layout_width="wrap_content"
  28. android:layout_height="wrap_content"
  29. android:layout_gravity="center_horizontal"
  30. android:gravity="center"
  31. />
  32. </LinearLayout>
  33. <LinearLayout
  34. android:layout_width="0px"
  35. android:layout_height="wrap_content"
  36. android:layout_weight="3"
  37. android:orientation="horizontal"
  38. >
  39. <Button
  40. android:layout_marginLeft="2px"
  41. android:layout_marginTop="2px"
  42. android:layout_marginBottom="2px"
  43. android:layout_marginRight="2px"
  44. android:id="@+id/app_add"
  45. android:layout_width="wrap_content"
  46. android:layout_height="wrap_content"
  47. android:text="添加"
  48.  
  49. />
  50. </LinearLayout>
  51. </LinearLayout>

  

最后附上源码,有需要的请留言留下你的邮箱,供嫌长的童鞋学习学习= = ~

有问题请留言

小生功能贴<一> --- 动态添加应用 具有长按删除功能的更多相关文章

  1. JS自定义功能函数实现动态添加网址参数修改网址参数值

    无论是前端开发还是后台设计,很多时候开发人员都需要获取当前或目标网址的相关信息.这个已有现成的内置对象属性可以直接调用了(下面是获取当前页面的参考代码) 复制代码 代码如下: <script t ...

  2. winfrom 动态添加控件,以及删除

      private void btnadd_Click(object sender, EventArgs e)         {             int fileCount = 0;     ...

  3. GrideVlew提供点击按钮添加新数据,单击项目修改,长按删除功能

    package com.example.wang.myapplication; import android.app.AlertDialog; import android.content.Dialo ...

  4. 点击按钮添加一行,和本行的删除功能,序号变动,name属性更改

    <!--html结构--> <div> <input type="button" value="添加一行" onclick=&qu ...

  5. vue实战记录(五)- vue实现购物车功能之商品总金额计算和单选全选删除功能

    vue实战,一步步实现vue购物车功能的过程记录,课程与素材来自慕课网,自己搭建了express本地服务器来请求数据 作者:狐狸家的鱼 本文链接:vue实战-实现购物车功能(五) GitHub:sue ...

  6. Android仿qq聊天记录长按删除功能效果

    最近项目在做IM即时通讯开发,在删除聊天列表的时候跟删除聊天详细信息的时候,产品经理想要跟ios一样,在当前选中行上方弹出一个删除窗口.于是先从网上找demo,找了一个发现是Dialog做的,我感觉没 ...

  7. day_5.26python动态添加属性和方法

    python动态添加属性和方法 既然给类添加⽅法,是使⽤ 类名.⽅法名 = xxxx ,那么给对象添加⼀个⽅法 也是类似的 对象.⽅法名 = xxx '''2018-5-26 13:40:09pyth ...

  8. ASP.NET给Table动态添加删除行,并且得到控件的值

    ASP.NET给Table动态添加控件并且得到控件的值 由于跟老师做一个小的项目,可是我自己又不太懂js,所以一直为动态建立表格并且能动态的取值和赋值感到苦恼.起初在网上找到了一些js资源,解决了动态 ...

  9. AngularJS:实现动态添加输入控件功能

    功能要求如下:1.    点击加号可以增加输入框.2.    点击减号可以减少输入框.3.    当输入框只有一个的时候,不能再减少输入框.效果图如下:只有一个输入框有多个输入框 要实现这个功能,可以 ...

随机推荐

  1. Unity3D音乐音效学习笔记

    对于Unity3D的音乐音效这块一直没有好好的看过,现在准备好好的研究一下,并作为一个笔记记录下. 支持格式 在游戏中,一般存在两种音乐,一种是时间较长的背景音乐,一种是时间较短的音效(比如按钮点击, ...

  2. C#中的强制类型转换与as转换的区别

    C#中的强制类型转换 例如有ClassA与ClassB两个类创建两个类的对象进行转换 1 2 ClassA a = new ClassA();  ClassB b = new ClassB(); 如果 ...

  3. 如何使用C#去灰度化一幅图像

    灰度化一幅图像就是将图像的色彩信息全部丢掉,将24位的位图信息,用8位来表示,灰度图共有256级灰度等级,也就是将24位位图的一点如(255,255,255)转换成255,所以R,G,B三个值所乘的系 ...

  4. Winform开发框架之权限管理系统

    本文章转载:http://www.cnblogs.com/wuhuacong/archive/2011/05/08/2040620.html 至此,权限管理模块介绍已经完毕,下面给出一个调用例子Dem ...

  5. Javascript可变长度参数列表 - Arguments对象

    在一个函数体内,标识符arguments具有特殊含义. Arguments对象是一个类似数组的对象 eg: 验证函数参数的正确数目 function f(x, y, z) { if (argument ...

  6. URAL 1780 G - Gray Code 找规律

    G - Gray CodeTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view ...

  7. C语言经典算法100例(二)

    11.判断某一年是否是闰年. //判断某一年份是否是闰年 int IsLeapYear(int year) { return (year % 400 == 0 || (year % 4 == 0) & ...

  8. ${var}变量替换

    ${age},${name} 给定一个上下文 Map<String,String> context 使用上下文替换变量private static final Pattern VAR_PA ...

  9. Keeplived 详解

    http://www.cnblogs.com/pricks/p/3822232.html

  10. 实例源码--Android简单音乐播放器源码

      下载源码   技术要点: 1.本地音乐管理 2.在线音乐听歌.下载 3.音频流的解码 4. HTTP通信模块 5. Sqlite数据库 6. 源码带详细的中文注释 ...... 详细介绍: 1.本 ...