2016-03-14 4 views
0

Я разрабатываю AppLock, который блокирует определенные приложения. Для этого у меня есть экран, содержащий ListView, а ListView имеет несколько коммутаторов, по одному для каждого установленного приложения.Получить выбранные элементы из списка ViewView

Мне нужно знать, какие переключатели пользователь включил, и извлеките текст, написанный на нем.

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> 
+0

Думаю, вам нужно будет хранить состояния переключателей в классе POJO. Таким образом, у вас будут 'String taskName' и' boolean taskState' как поля этого класса и сохранить состояние переключателя в соответствующем элементе. –

+0

Вы можете поддерживать массив boolean [], чтобы отслеживать все переключатели для каждой позиции в списке. Пример: сначала все ложные говорят! Когда переключатель включен, скажем, положение 2 в списке, затем массив [2] = true; таким образом можно легко отслеживать. – Sjd

ответ

2

Расширьте ArrayAdapter и переопределите метод getView, где вам нужно раздуть собственный макет. Таким образом, он будет содержать столько переключателей, сколько вам нужно. Затем каждый коммутатор может реализовать собственный OnCheckedChangeListener, чтобы вы точно знали, какой переключатель был изменен.

EDIT

Создайте новый класс, который расширяет 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; 
} 
+0

Вы хотите сказать, что я должен расширить свой класс SensitiveApps с помощью ArrayAdapter, а затем переопределить метод getView? И что делать в getView? – SanketSB

1

Я думаю, что вы можете достичь своей цели, если вы создаете getter и setter для коммутатора в модели. А для вашего установленного приложения (при щелчке пользователя) вы устанавливаете некоторое значение, например, setInstalledApp(true); И когда вы зацикливаете свой массив с помощью переключателя getter, на которое нажимается приложение. Например:

if(switch.isInstalledApp()){ 
    //get item data 
}else{ 

} 

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

Смежные вопросы