Получить выбранные элементы из ListView
Я разрабатываю AppLock, который блокирует определенные приложения. Для этого у меня есть экран, который содержит ListView, а ListView имеет несколько коммутаторов, по одному на каждое установленное приложение.
Мне нужно знать, какие переключатели пользователь так включил и извлечь текст, написанный в нем.
SensitiveApps.java
package com.sr.droidlock;
import android.content.Intent;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Switch;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SensitiveApps extends ActionBarActivity {
Switch appName;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_sensitive_apps);
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List pkgAppsList = getPackageManager().queryIntentActivities(mainIntent, 0);
ArrayList<String> tasks = new ArrayList<String>();
appName = (Switch) findViewById(R.id.appName) ;
for (Object object : pkgAppsList)
{
ResolveInfo info = (ResolveInfo) object;
final String title = (String)((info != null) ? getBaseContext().getPackageManager().getApplicationLabel(info.activityInfo.applicationInfo) : "???");
tasks.add(title);
}
Collections.sort(tasks, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
return s1.compareToIgnoreCase(s2);
}
});
ArrayAdapter<String> adapter = new ArrayAdapter <String>(this,R.layout.layout_sensitive_apps, R.id.appName ,tasks);
ListView listView = (ListView) findViewById(R.id.listView);
listView.setAdapter(adapter);
}
}
activity_sensitive_apps.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:orientation="vertical"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="com.sr.droidlock.SensitiveApps">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/listView" />
</LinearLayout>
layout_sensitive_apps
<?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:orientation="vertical" >
<Switch
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginRight="10dp"
android:layout_marginLeft="10dp"
android:text="New Switch"
android:id="@+id/appName" />
</LinearLayout>
2 ответа
Расширьте ArrayAdapter и переопределите метод getView, где вам нужно накачать свой собственный макет. Так что он будет содержать столько переключателей, сколько вам нужно. Тогда каждый переключатель может реализовать свой собственный OnCheckedChangeListener, чтобы вы точно знали, какой переключатель был изменен.
РЕДАКТИРОВАТЬ
Создайте новый класс CustomArrayAdapter, который расширяет ArrayAdapter и переопределяет getView.
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// Inflate view
LayoutInflater inflator = mContext.getLayoutInflater();
View view = inflator.inflate(R.layout.list_item_topic, null);
switch = (Switch)view.findViewById(R.id.any_switch);
switch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
// TODO Auto-generated method stub
}
});
// TODO bind other views or anything else you need
return view;
}
Я думаю, что вы можете достичь своей цели, если вы создадите getter
а также setter
для вашего переключателя в вашей модели. А для установленного приложения (по клику пользователя) вы устанавливаете какое-то значение, например setInstalledApp(true);
И когда вы зацикливаетесь через массив проверяете с помощью switch getter
какой пользователь приложения нажал. Например:
if(switch.isInstalledApp()){
//get item data
}else{
}
Надеюсь помочь!