2016-05-24 81 views
-2

我正在研究一個顯示已安裝應用程序列表的應用程序。 我添加複選框到此列表中的每個項目的選擇應用程序 問題是,當我設置複選框狀態之一檢查和向下滾動,我看到一些其他複選框狀態已更改爲檢查 我該如何解決這個問題?? 這是我的代碼點擊列表項時如何設置勾選複選框?

的AllAppsActivity.java代碼:

public class AllAppsActivity extends ListActivity { 

private PackageManager packageManager = null; 
private List<ApplicationInfo> applist = null; 
private ApplicationAdapter listadaptor = null; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    packageManager = getPackageManager(); 

    new LoadApplications().execute(); 
} 


@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    if (v != null) { 
     CheckBox checkBox = (CheckBox) v.findViewById(R.id.checkBox); 
     checkBox.setChecked(!checkBox.isChecked()); 
    } 



} 

private List<ApplicationInfo> checkForLaunchIntent(List<ApplicationInfo> list) { 
    ArrayList<ApplicationInfo> applist = new ArrayList<ApplicationInfo>(); 
    for (ApplicationInfo info : list) { 
     try { 
      if (null != packageManager.getLaunchIntentForPackage(info.packageName)) { 
       applist.add(info); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    return applist; 
} 

private class LoadApplications extends AsyncTask<Void, Void, Void> { 
    private ProgressDialog progress = null; 

    @Override 
    protected Void doInBackground(Void... params) { 
     applist = checkForLaunchIntent(packageManager.getInstalledApplications(PackageManager.GET_META_DATA)); 
     listadaptor = new ApplicationAdapter(AllAppsActivity.this, 
       R.layout.snippet_list_row, applist); 

     return null; 
    } 

    @Override 
    protected void onCancelled() { 
     super.onCancelled(); 
    } 

    @Override 
    protected void onPostExecute(Void result) { 
     setListAdapter(listadaptor); 
     progress.dismiss(); 
     super.onPostExecute(result); 
    } 

    @Override 
    protected void onPreExecute() { 
     progress = ProgressDialog.show(AllAppsActivity.this, null, 
       "Loading application info..."); 
     super.onPreExecute(); 
    } 

    @Override 
    protected void onProgressUpdate(Void... values) { 
     super.onProgressUpdate(values); 
    } 
} 
} 

的ApplicationAdapter.java代碼:

public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo> { 
private List<ApplicationInfo> appsList = null; 
private Context context; 
private PackageManager packageManager; 

public ApplicationAdapter(Context context, int textViewResourceId, 
     List<ApplicationInfo> appsList) { 
    super(context, textViewResourceId, appsList); 
    this.context = context; 
    this.appsList = appsList; 
    packageManager = context.getPackageManager(); 
} 

@Override 
public int getCount() { 
    return ((null != appsList) ? appsList.size() : 0); 
} 

@Override 
public ApplicationInfo getItem(int position) { 
    return ((null != appsList) ? appsList.get(position) : null); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (null == view) { 
     LayoutInflater layoutInflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = layoutInflater.inflate(R.layout.snippet_list_row, null); 
    } 

    ApplicationInfo data = appsList.get(position); 
    if (null != data) { 
     TextView appName = (TextView) view.findViewById(R.id.app_name); 
     TextView packageName = (TextView) view.findViewById(R.id.app_paackage); 
     ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); 

     appName.setText(data.loadLabel(packageManager)); 
     packageName.setText(data.packageName); 
     iconview.setImageDrawable(data.loadIcon(packageManager)); 
    } 
    return view; 
    } 
    }; 

activity_main.xml中的文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="vertical" > 

<ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" /> 

和snippet_list_row.xml代碼:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" > 

<ImageView 
    android:id="@+id/app_icon" 
    android:layout_width="50dp" 
    android:layout_height="50dp" 
    android:padding="3dp" 
    android:scaleType="centerCrop" /> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="match_parent" 
    android:gravity="center_vertical" 
    android:orientation="vertical" 
    android:paddingLeft="5dp" > 

    <TextView 
     android:id="@+id/app_name" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical" 
     android:textStyle="bold" /> 

    <TextView 
     android:id="@+id/app_paackage" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:gravity="center_vertical" /> 
</LinearLayout> 

<CheckBox 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:id="@+id/checkBox" 
    android:focusable="false" /> 

</LinearLayout> 
+0

的可能的複製[?如何讓檢查的聯繫人列表(http://stackoverflow.com/que stions/37179789 /如何獲取聯繫人列表) – Bharatesh

回答

1

你要跟蹤哪些複選框被選中,並用它來在ApplicationAdapter.getView集檢查。這將是在這一領域

if (null != data) { 
     TextView appName = (TextView) view.findViewById(R.id.app_name); 
     TextView packageName = (TextView) view.findViewById(R.id.app_paackage); 
     ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); 

     appName.setText(data.loadLabel(packageManager)); 
     packageName.setText(data.packageName); 
     iconview.setImageDrawable(data.loadIcon(packageManager)); 
    } 

的實現可能是: 一是適應適配器類(雙關語不打算),以能夠保留,如果一個項目被選中

public class ApplicationAdapter extends ArrayAdapter<ApplicationInfo> { 
    ... 
+ private SparseArray<Boolean> checkedList = new SparseArray(); 
    ... 

+ public void toggleChecked(int position){ 
+  checkedList.put(position,!checkedList.get(position,false)); 
+ } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ... 

     ApplicationInfo data = appsList.get(position); 
     if (null != data) { 
      TextView appName = (TextView) view.findViewById(R.id.app_name); 
      TextView packageName = (TextView) view.findViewById(R.id.app_paackage); 
      ImageView iconview = (ImageView) view.findViewById(R.id.app_icon); 
+   CheckBox checkBox = (CheckBox) v.findViewById(R.id.checkBox); 

      appName.setText(data.loadLabel(packageManager)); 
      packageName.setText(data.packageName); 
      iconview.setImageDrawable(data.loadIcon(packageManager)); 
+   checkBox.setChecked(checkedList.get(position,false); 
     } 
     return view; 
     } 
    }; 

然後一個需要告訴該項目被點擊AllApsActivity的onListItemClicked,這可能是這樣的:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    if (v != null) { 
     CheckBox checkBox = (CheckBox) v.findViewById(R.id.checkBox); 
     checkBox.setChecked(!checkBox.isChecked()); 
+  listadaptor.toggleChecked(position); 
    } 
} 
+0

此外,您似乎沒有複製整個xml文件,並且我建議您每次使用適配器視圖的持有者而不是使用findViewById。 – YannickSSE

+0

感謝您的回答。所以我應該保持複選框的價值?但我有一個問題,當我添加此代碼'checkBox.setChecked(data.isChecked);'我得到錯誤無法解析符號實際** isChecked **有錯誤。我不是一個專業的程序員,你能解釋一下嗎? – erfan

+0

你在哪裏定義applicationInfo添加一個布爾isChecked,也許顯示ApplicationInfo類,我可以告訴你更多。並且不要忘記調整onListItemClick到 – YannickSSE

相關問題