安卓开发时,LiseView会经常使用,所以自定义适配器是必须要掌握的。在适配器中,经常会有按钮存在,
会涉及到点击事件等很多功能,如果都在适配器中写的话,会导致适配器很臃肿,而且,有些参数不好传递过来,
所以这时使用接口,会非常方便。
列如:我做了一个简单的手机应用管理,效果如下;
这时“删除按钮“就可以用接口来实现。方法如下:
新建一个接口
public interface Install {
//接口传入的参数要仔细考虑,使用什么传什么
//这里传入两个参数:包名,该应用在listView中的位置。 void installApp(String appName,int position); }
在自定义适配器中:
import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; import java.util.List; /** * Created by Administrator on 2015/9/30. */ public class MyAdapter extends BaseAdapter{ private Listlist; private Context context;
//声明接口 private Install install;
//设置set方法,便于获取接口,否则会出现控制针异常。 public void setInstall(Install install) { this.install = install; } public MyAdapter(Listlist, Context context) { this.list = list; this.context = context; } @Override public int getCount() { return list.size(); } @Override public AppInfo getItem(int i) { return list.get(i); } @Override public long getItemId(int i) { return i; } @Override public View getView(int i, View view, ViewGroup viewGroup) { HandlerView handlerView=new HandlerView(); final AppInfo appInfo1=list.get(i); if(view==null) { view= LayoutInflater.from(context).inflate(R.layout.main_list,null);
//应用名 handlerView.name=(TextView)view.findViewById(R.id.name);
//应用版本
handlerView.
version=(TextView)view.findViewById(R.id.
version)
;
//应用图片
handlerView.
image=(ImageView)view.findViewById(R.id.
image)
;
//删除按钮 handlerView.delete=(Button)view.findViewById(R.id.deleteBtn); view.setTag(handlerView); }else { handlerView=(HandlerView)view.getTag(); } handlerView.name.setText(appInfo1.appName); handlerView.version.setText(appInfo1.versionName); handlerView.image.setImageDrawable(appInfo1.appIcon);
//因为匿名内部类的关系,有些参数有事会传不进去,可以用final 贯穿。
final int position=i;//当前点击的Item的位置
final String packe=appInfo1.packageName;//获取到的应用的包名
//按钮的点击监听
handlerView.
delete.setOnClickListener(
new View.OnClickListener() {
@Override
public void onClick(View view) {
//这里调用接口的方法,并传入参数,就可以在其他Activity实现接口
install.installApp(packe,position); } }); return view; } public class HandlerView { private TextView name; private TextView version; private ImageView image; private Button delete; } }在MainActivity中实现接口,复写接口的方法
public class MainActivity extends Activity implements Install{ private Listlist=new ArrayList (); private MyAdapter myAdapter; private ListView view; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); view=(ListView)findViewById(R.id.listview); view.setOnItemClickListener(new ItemCLicker());
myAdapter=new MyAdapter(list,MainActivity.this);
//给适配器指定接口 myAdapter.setInstall(MainActivity.this);}
@Override
//接口中的方法 public void installApp( String appName, int flag) {
deleteApp(MainActivity.this,appName,0); }
//删除应用方法
public void deleteApp(String packageName,int tag) {
//卸载应用: Uri uri=Uri.parse("package:"+packageName); Intent intent=new Intent(Intent.ACTION_DELETE,uri);
startActivity(intent);
//startActivityForResult(intent,tag);也可以使用该方法,删除后可以进行刷新操作}