Получить выбранные элементы из 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{

} 

Надеюсь помочь!

Другие вопросы по тегам