小生功能贴<一> --- 动态添加应用 具有长按删除功能
---恢复内容开始---
动态添加应用 具有长按删除功能 功能如下图:
(图片显示功能不是你要的,那就默默关闭页面吧)
设计思路:
页面一:用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. 当输入框只有一个的时候,不能再减少输入框.效果图如下:只有一个输入框有多个输入框 要实现这个功能,可以 ...
随机推荐
- update多表更新的2种方式
update t1 set TermBeginQty =isnull((select top 1 JiaoPlusQty from WMS_RptMaterialPutDaily r where t1 ...
- VC中监测函数运行时间(一)—分钟,秒,毫秒
//myTimer.h // [10/16/2013 Duan Yihao] #pragma once #include "StdAfx.h" ////////////////// ...
- 五,整型变量的读入——scanf函数
我们先不说变量怎么读入,我们先说说读入是什么?为什么要读入? 先来看一个例子,我现在需要计算两个整数的乘积.先看只用前面学过的内容的实现. #include<stdio.h> int ma ...
- JavaWeb学习篇之----容器Response详解
今天在来看一下Response容器的相关知识,其实这篇blog早就应该编写了,只是最近有点忙,所以被中断了.下面我们就来看一下Response容器的相关知识吧.Response和我们即将在后面说到的R ...
- Android EditText载入HTML内容(内容包括网络图片)
android中的Html.fromHtml能够用来载入HTML的内容.fromHtml有三个參数须要设置,第一个是要显示的html内容,第二个就是要说的重点,ImageGetter,用来处理图片载入 ...
- Android 监听屏幕锁屏,用户解锁
在做一个程序的时候,需要时刻保持某一服务是启动的,因此想到了通过监听屏幕SCREEN_ON和SCREEN_OFF这两个action.奇怪的是,这两个action只能通过代码的形式注册,才能被监听到,使 ...
- 权限检查联系人ProfileProvider
每日一贴,今天的内容关键字为权限检查 ProfileProvider继承自AbstractContyactsProvider. 源代码请自行下载 每日一道理 书籍好比一架梯子,它能引领人们登上 ...
- QM课程02-外部功能
质量计划 · 对质量计划和检验计划进行基本数据的管理 · 物料说明 · 检验计划 质量检验 · 触发检验 · 具有检验计划选择和样本计算的检验处理 · 打印采样和检验的车间文档 · 记录结果和缺陷 · ...
- mysql 日期函数格式
mysql中的from_unixtime函数的format表达式字段描述: %M 月名字(January……December) %W 星期名字(Sunday……Saturday) %D 有英语前缀的 ...
- SqlDependency缓存数据库表小案例
SqlDependency的简介: SqlDependency是outputcache网页缓存的一个参数,它的作用是指定缓存失效的数据库依赖项,可以具体到数据库和表. SqlDependency能解决 ...