---恢复内容开始---
动态添加应用 具有长按删除功能 功能如下图:
(图片显示功能不是你要的,那就默默关闭页面吧)
设计思路:
页面一:用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 53 @Override 54 public void onBackPressed() { // 长按后 不想删除 按返回键的触发事件 55 if (! Constant.press) 56 finish(); 57 else { 58 String st; 59 60 for ( int k=12;k<Constant.num-1;k++){st= Constant.text[k]; 61 if (st.equals("微信")){Constant.image[k]= R.drawable.weixin_press;} 62 if (st.equals("微博")){Constant.image[k]= R.drawable.weibo_press;} 63 if (st.equals("酷狗音乐")){Constant.image[k]= R.drawable.kugou_press;} 64 if (st.equals("华农宝")){Constant.image[k]= R.drawable.huanongbao_press;} 65 if (st.equals("QQ")){Constant.image[k]= R.drawable.qq_press;} 66 if (st.equals("飞信")){Constant.image[k]= R.drawable.feixin_press;} 67 } 68 Constant.press= false ; 69 Constant.num++ ; 70 Constant.image[Constant.num-1]= R.drawable.image13; 71 Constant.text[Constant.num-1]="13" ; 72 for ( int i=0;i<Constant.num;i++ ){ 73 Log.v("num" ,Constant.text[i]); 74 } 75 adp.notifyDataSetChanged(); // 更新 76 } 77 } 78 79 private class appClick implements OnTouchListener{ // 子Item的OnTouch触发事件 80 int position; 81 public appClick( int position) { 82 // TODO Auto-generated constructor stub 83 this .position= position; 84 } 85 86 @Override 87 public boolean onTouch(View arg0, MotionEvent event) { 88 // TODO Auto-generated method stub 89 90 if (event.getAction() == MotionEvent.ACTION_UP){ 91 Log.v("s","抬起" ); 92 93 endMili=System.currentTimeMillis(); // 当前时间对应的毫秒数 94 95 long Time = endMili-startMili; // 时间差 96 Log.v("time" ,Long.toString(Time)); 97 98 if (Time>1000){ // 根据时间差来判断是短按还是长按,这里标准时一秒 99 Log.v("long","long_out" );appLongClick(position);} 100 else { 101 Log.v("short","short_out" );appShortClick(position);} 102 } 103 104 105 106 if (event.getAction() == MotionEvent.ACTION_DOWN){ 107 startMili=System.currentTimeMillis(); // 当前时间对应的毫秒数 108 Log.v("q","按下" ); 109 } 110 return true ; 111 } 112 113 } 114 115 private void appShortClick( int p){ // 短按处理 116 int position= p; 117 Log.v("short","short_in" ); 118 if (Constant.press){ 119 Log.v("ee","eee" ); 120 for ( int k=position;k<Constant.num-1;k++ ){ 121 Constant.image[k]=Constant.image[k+1 ]; 122 Constant.text[k]=Constant.text[k+1 ]; 123 } 124 Log.v("shit",Constant.text[Constant.num-1 ]); 125 Constant.press= true ; 126 Constant.image[Constant.num-1]= R.drawable.image13; 127 Constant.text[Constant.num-1]="13" ; 128 if (Constant.num!=13 ) 129 {Constant.num--;} else {Constant.press= false ;} 130 Log.v("d" ,Integer.toString(Constant.num)); 131 adp.notifyDataSetChanged(); 132 // 更新 133 } else if (!Constant.press&&p==Constant.num-1 ){ 134 Intent intent = new Intent(); 135 intent.setClass(MainActivity. this , AddApplication. class ); 136 startActivity(intent); 137 finish(); 138 } 139 140 141 142 } 143 private void appLongClick( int p){ // 长按处理 144 145 if (!Constant.press&&p==Constant.num-1 ){} 146 else { 147 String st; 148 for ( int k=12;k<Constant.num-1;k++){st= Constant.text[k]; 149 if (st.equals("微信")){Constant.image[k]= R.drawable.weixin_press;} 150 if (st.equals("微博")){Constant.image[k]= R.drawable.weibo_press;} 151 if (st.equals("酷狗音乐")){Constant.image[k]= R.drawable.kugou_press;} 152 if (st.equals("华农宝")){Constant.image[k]= R.drawable.huanongbao_press;} 153 if (st.equals("QQ")){Constant.image[k]= R.drawable.qq_press;} 154 if (st.equals("飞信")){Constant.image[k]= R.drawable.feixin_press;} 155 } 156 157 Constant.press= true ; 158 Constant.num-- ; 159 adp.notifyDataSetChanged(); // 更新 160 } 161 } 162 163 class Grid_Adapter extends BaseAdapter{ // GridView的自定义adapter 164 Context mContext; 165 public Grid_Adapter(Context context, int num){ 166 mContext= context; 167 168 } 169 @Override 170 public int getCount() { 171 // TODO Auto-generated method stub 172 return Constant.num; 173 } 174 175 @Override 176 public Object getItem( int arg0) { 177 // TODO Auto-generated method stub 178 return Constant.image[arg0]; 179 } 180 181 @Override 182 public long getItemId( int arg0) { 183 // TODO Auto-generated method stub 184 return arg0; 185 } 186 187 @Override 188 public View getView( int position, View arg1, ViewGroup arg2) { 189 // TODO Auto-generated method stub 190 191 LayoutInflater inflater = LayoutInflater.from(mContext); 192 View view = null ; 193 view = inflater.inflate(R.layout.grid_adapter, null ); 194 ImageView im= (ImageView)view.findViewById(R.id.ItemImage); 195 196 TextView te= (TextView)view.findViewById(R.id.ItemText); 197 198 im.setBackgroundResource(( int )getItem(position)); 199 te.setText(Constant.text[position]); 200 201 if (position>11&&position<=Constant.num-1 ){ 202 203 view.setOnTouchListener( new appClick(position)); 204 205 } 206 207 208 209 return view; 210 211 }} 212 } 213 214
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
<?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>
最后附上源码,有需要的请留言留下你的邮箱,供嫌长的童鞋学习学习= = ~
有问题请留言