原问题来自于CSDN问答频道,更多解决方案见:http://ask.csdn.net/questions/2175
问题描述:
我创建了一个自定义的 listview,有 Image,Text 和 checkbox。如何检测是否选择或未选择复选框。我使用了 onItemClick() 但是没有被调用。我使用的正确吗?
class PInfo { String appname = ""; String pname = ""; Drawable icon; } public class InstalledApps extends Activity{ private static LayoutInflater inflater=null; private ListView listview; private Activity activity; List<PInfo> installedApps = new ArrayList<PInfo>(); @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.applist); activity = this; listview = (ListView)findViewById(R.id.listView1); PackageManager pm = getPackageManager(); List<ApplicationInfo> packages = pm.getInstalledApplications(PackageManager.GET_META_DATA); for(ApplicationInfo app : packages) { PInfo newInfo = new PInfo(); newInfo.appname = (String) app.loadLabel(pm); newInfo.pname = app.packageName; //newInfo.icon = app.icon; //Drawable dd = activity.getResources().getDrawable(app.icon); newInfo.icon = app.loadIcon(getPackageManager()); if((app.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) == 1) { installedApps.add(newInfo); } else if ((app.flags & ApplicationInfo.FLAG_SYSTEM) == 1) { installedApps.add(newInfo); } else { installedApps.add(newInfo); } } InstalledAppsAdapter iap = new InstalledAppsAdapter(this, installedApps); listview.setAdapter(iap); } } class InstalledAppsAdapter extends BaseAdapter{ private Activity activity; private static LayoutInflater inflater=null; List<PInfo> installedApps = new ArrayList<PInfo>(); ListView listview; public InstalledAppsAdapter(Activity a, List<PInfo> b) { // TODO Auto-generated constructor stub installedApps = b; activity = a; inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE); listview = (ListView)activity.findViewById(R.id.listView1); //Here is where I have put it currently.. listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub PInfo newInfo = (PInfo) listview.getItemAtPosition(arg2); System.out.println(newInfo.appname); } }); } @Override public int getCount() { // TODO Auto-generated method stub return installedApps.size(); } @Override public Object getItem(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public long getItemId(int arg0) { // TODO Auto-generated method stub return arg0; } @Override public View getView(int arg0, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub View customView = inflater.inflate(R.layout.listrow, arg2,false); ImageView iv = (ImageView)customView.findViewById(R.id.imageView1); TextView tv= (TextView) customView.findViewById(R.id.textView2); CheckBox cb= (CheckBox)customView.findViewById(R.id.checkBox1); PInfo pinfo = installedApps.get(arg0); tv.setText(""+pinfo.appname); iv.setImageDrawable(pinfo.icon); return customView; } }
我要在哪里添加下面的代码(如果这是正确的listner)
listview.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub PInfo newInfo = (PInfo) listview.getItemAtPosition(arg2); System.out.println(newInfo.appname); } });
解决方案:
在 getView 里面加入下面的代码:
@Override public View getView(int arg0, View arg1, ViewGroup arg2) { // TODO Auto-generated method stub View customView = inflater.inflate(R.layout.listrow, arg2,false); ImageView iv = (ImageView)customView.findViewById(R.id.imageView1); TextView tv= (TextView) customView.findViewById(R.id.textView2); CheckBox cb= (CheckBox)customView.findViewById(R.id.checkBox1); cb.setOnCheckedChangeListener(new OnCheckedChangeListener() { public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if ( isChecked ) { // perform logic } } }); } PInfo pinfo = installedApps.get(arg0); tv.setText(""+pinfo.appname); iv.setImageDrawable(pinfo.icon); return customView; }