如何在没有checkbox的情况下在listview中显示已安装的应用程序列表在列表视图滚动时未被选中?
我的目标是显示已安装的应用程序列表(在一个活动中 )的自定义列表视图没有checkbox得到取消选中(当列表视图滚动时)。
问题 : 当ListView滚动时,checkbox的选中状态变为未选中状态。
我的进展到目前为止 :虽然这个博客条目清楚地显示了如何摆脱列表视图中的checkbox取消选中的问题,不同的是,它使用模型作为自定义类,而在我的情况下,它是一个系统类[即packageList1 = packageManager.getInstalledPackages(0);]
我该如何解决这个问题? 以下是我的代码尝试。 我能够用checkbox成功显示listviw中的应用程序,只是在滚动列表视图时检查状态变得没有选中。
我是开放给任何方法作为答案,使我能够显示安装的应用程序在列表视图列表中没有检查状态的checkbox将成为未经检查
我的自定义Listadapter类 :
public class Listadapter extends BaseAdapter { private static String TAG = "focus"; List<PackageInfo> packageList; Activity context; PackageManager packageManager; boolean[] itemChecked; List<String> appNamestoBlock_local; public Listadapter(Activity context, List<PackageInfo> packageList, PackageManager packageManager, List<String> appNamestoBlock) { super(); this.context = context; this.packageList = packageList; this.packageManager = packageManager; this.appNamestoBlock_local = appNamestoBlock; itemChecked = new boolean[packageList.size()]; } private String getSerializedBlockedAppNames() { String serializedBlockedAppNames; Log.v(TAG, "-------- List<String> list = " + TextUtils.join(",", appNamestoBlock_local)); serializedBlockedAppNames = TextUtils.join(",", appNamestoBlock_local); return serializedBlockedAppNames; } private class ViewHolder { TextView apkName; CheckBox ck1; } public int getCount() { return packageList.size(); } public Object getItem(int position) { return packageList.get(position); } public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { final ViewHolder holder; LayoutInflater inflater = context.getLayoutInflater(); if (convertView == null) { convertView = inflater.inflate(R.layout.list_item, null); holder = new ViewHolder(); holder.apkName = (TextView) convertView .findViewById(R.id.textView1); holder.ck1 = (CheckBox) convertView.findViewById(R.id.checkBox1); holder.ck1.setFocusable(false); convertView.setTag(holder); } else { holder = (ViewHolder) convertView.getTag(); } PackageInfo packageInfo = (PackageInfo) getItem(position); Drawable appIcon = packageManager .getApplicationIcon(packageInfo.applicationInfo); String appName = packageManager.getApplicationLabel( packageInfo.applicationInfo).toString(); appIcon.setBounds(0, 0, 40, 40); holder.apkName.setCompoundDrawables(appIcon, null, null, null); holder.apkName.setCompoundDrawablePadding(15); holder.apkName.setText(appName); holder.ck1.setChecked(false); if (itemChecked[position]) holder.ck1.setChecked(true); else holder.ck1.setChecked(false); // Log.v(TAG, // "-------- checking in getView() in ListAdapter if appName is in getSerializedBlockedAppNames()"); if (getSerializedBlockedAppNames().contains(appName)) { Log.v(TAG + " ListAdapter", "-------- YES, appName is in getSerializedBlockedAppNames(), appName = " + appName); holder.ck1.setChecked(true); } holder.ck1.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { itemChecked[position] = true; } else { itemChecked[position] = false; } } }); return convertView; } }
在我主要活动的onCreate函数中 :
PackageManager packageManager = getPackageManager(); List<PackageInfo> packageList1 = packageManager.getInstalledPackages(0); Listadapter Adapter = new Listadapter(MainActivityCircularSeekbar.this, packageList1, packageManager, blockedApps);
活动
import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.content.pm.PackageInfo; import android.os.Bundle; import android.widget.ListView; public class AppScreen extends Activity { private ListView list; ArrayList<Datamodel> res; MyAdapter _adapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.app_screen); list = (ListView) findViewById(R.id.list); List<PackageInfo> _myapps = getPackageManager().getInstalledPackages(0); res = new ArrayList<Datamodel>(); for (int i = 0; i < _myapps.size(); i++) { PackageInfo p = _myapps.get(i); Datamodel _model = new Datamodel(); _model.setAppname(p.applicationInfo.loadLabel(getPackageManager()).toString()); res.add(_model); System.out.println("ajajajja" + res.size() + res.get(i).getAppname()); } _adapter = new MyAdapter(getApplicationContext(), res); _adapter.notifyDataSetChanged(); list.setAdapter(_adapter); } }
Datamodel类
public class Datamodel { public String appname = ""; private boolean selected; public String getAppname() { return appname; } public void setAppname(String appname) { this.appname = appname; } public boolean isSelected() { return selected; } public void setSelected(boolean isChecked) { this.selected = isChecked; } }
适配器类
public class MyAdapter extends BaseAdapter { Context _ctx; LayoutInflater inflater; public ArrayList<Datamodel> data; public MyAdapter(Context c, ArrayList<Datamodel> _arraylist) { this._ctx = c; this.data = _arraylist; } @Override public int getCount() { return data.size(); } @Override public Object getItem(int position) { return position; } @Override public long getItemId(int position) { return 0; } @Override public View getView(final int position, View convertView, ViewGroup parent) { inflater = (LayoutInflater) _ctx.getApplicationContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View itemView = inflater.inflate(R.layout.inflator, parent, false); final CheckBox checks = (CheckBox) itemView.findViewById(R.id.b); final TextView _setappname = (TextView) itemView.findViewById(R.id.a); checks.setChecked(data.get(position).isSelected()); Datamodel obj = data.get(position); _setappname.setText(obj.getAppname()); checks.setTag(position); checks.setOnCheckedChangeListener(new OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { int getPosition = (Integer) buttonView.getTag(); Datamodel _obj = data.get(getPosition); data.get(position).setSelected(isChecked); String ss = _obj.getAppname(); System.out.println("pos is" + getPosition); } }); return itemView; } }
活动XML
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.installedapps.AppScreen" > <ListView android:id="@+id/list" android:layout_height="fill_parent" android:layout_width="fill_parent"> </ListView>
充气机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="60dp" android:gravity="center" android:layout_gravity="center" android:orientation="horizontal" android:weightSum="2" > <TextView android:id="@+id/a" android:layout_width="0dp" android:layout_height="fill_parent" android:textColor="#000" android:layout_gravity="center" android:gravity="center" android:layout_weight="1.7" /> <CheckBox android:id="@+id/b" android:layout_width="0dp" android:layout_gravity="center" android:gravity="center" android:layout_weight="0.3" android:layout_height="wrap_content" /> </LinearLayout>