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

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

              

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

设计思路:

  页面一:用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. [oracle]一个最简单的oracle存储过程"proc_helloworld"

    1.编写.编写一个最最简单的存储过程,给它起个名字叫做proc_helloworldCREATE OR REPLACE PROCEDURE proc_helloworldISBEGIN   DBMS_ ...

  2. JAVA事务的概念

    From:http://www.cnblogs.com/kristain/articles/2038397.html 一.什么是事务 事务是访问数据库的一个操作序列,数据库应用系统通过事务集来完成对数 ...

  3. phper 要求

    做了这么多年php,今天看到一个07年的老文,才发现自己的水平太菜.转过来激励下自己 说句实话,写这个真够无聊的.本来看了某位大虾的类似文章,腹诽了几句也就算了.但是昨天晚上有个客户拿着这篇文章问我: ...

  4. PostgreSQL的 initdb 源代码分析之二

    继续分析 下面这一段,当 initdb --version 或者  initdb --help 才有意义. ) { ], || strcmp(argv[], ) { usage(progname); ...

  5. PostgreSQL中,database,schema,table之间关系

    从逻辑上看,schema,table,都是位于database之下. 首先,在postgres数据库下建立表(相当于建立在public schema下): [pgsql@localhost bin]$ ...

  6. Codeforces Round #333 (Div. 1) C. Kleofáš and the n-thlon 树状数组优化dp

    C. Kleofáš and the n-thlon Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contes ...

  7. C# WinForm 上传图片,文件到服务器的方法Uploader.ashx

    网上有很多方案,起初用时,因为对asp.net不太了解,觉得FTP实现不错,可是后来发现,如果机器在域控下,就会有问题. 一年过去了,asp.net也熟悉了,知道ajax没事应该用ashx,验证码也用 ...

  8. delphi 为应用程序添加提示

    type  TForm1 = class(TForm)    Button1: TButton;    Panel1: TPanel;    Edit1: TEdit;    procedure Fo ...

  9. 调用webservice查询手机号码归属地信息

    Web Services是由企业发布的完成其特定商务需求的在线应用服务,其他公司或应用软件能够通过Internet来访问并使用这项在线服务.在这里我们使用soap协议往webservice发送信息,然 ...

  10. 【剑指offer】八皇后问题

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/26614999 剑指offer上解决八皇后问题,没实用传统的递归或非递归回溯法,而是用了非常 ...