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

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

              

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

设计思路:

  页面一:用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>

  

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

有问题请留言

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

  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. Mac使用指南

    1.csrutil命令 简单来说 是苹果在新系统后加入的一个安全机制. Rootless讨论的前提是假定root账户是OS X(或者其他Unix系统)中对抗恶意程序保护操作系统的最后一道防线.意思是一 ...

  2. LinkedList类

    LinkedList类 LinkedList类和ArrayList,Vector基本相同,都有增.删.改.查等方法.LinkedList是继承List接口. import java.util.*; p ...

  3. UML图示

    来源: http://www.uml.org.cn/oobject/200901041.asp 近些天学习设计.由于没有具体项目,原有项目也没有什么设计的概念,只是看相关的书籍,所以着实有些抓狂.然最 ...

  4. 译 - 第 1 章:EF入门

    章节信息 Entity Framework 6 Recipes 第二版第一章: Chapter 1: Getting Started with Entity Framework ----------- ...

  5. PL/pgSQL学习笔记之二

    39.1.1 使用 PL/pgSQL的好处 SQL是 PostgreSQL和其他大多数关系型数据库作为查询语言而使用的语言.它可移植,并容易学习.但是SQL语句必须被数据库服务器逐条地执行. 这意味着 ...

  6. 2015 NOIP day1 t1 神奇的幻方 模拟

    神奇的幻方 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://www.luogu.org/problem/show?pid=2615 Descri ...

  7. C#三种模拟自动登录和提交POST信息的实现方法

    网页自动登录(提交Post内容)的用途很多,如验证身份.程序升级.网络投票等,以下是用C#实现的方法.       网页自动登录和提交POST信息的核心就是分析网页的源代码(HTML),在C#中,可以 ...

  8. NSRange类详解

    NSRange的定义 { NSUInteger location; NSUInteger length; } NSRange; NSRange是一个结构体,其中location是一个以0为开始的ind ...

  9. flash 入门课知识小结

    一. 几种类型帧的小结:(关键帧.空白关键帧.普通帧)1. 特点  帧——是进行flash动画制作的最基本的单位,每一个精彩的flash动画都是由很多个精心雕琢的帧构成的,在时间轴上的每一帧都可以包含 ...

  10. WEB服务器、应用程序服务器、HTTP服务器区别(转)

    WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器,这些问题困惑了很久,今天终于梳理清楚了: Web服务器 ...