2016-11-14 42 views
0

我正在開發一個應用程序,我想在ListView中顯示所有已安裝的應用程序。
我成功地這樣做了。我的ListView中的每個項目都包含一個應用程序名稱和一個CheckBox。我希望每當用戶按下按鈕時,CheckBox的所有應用程序名稱都是IsSelected()應該存儲在單獨的ArrayList中。如何添加選擇CheckBox以分離ArrayList的ListView項目?

我已經嘗試了很多東西,但沒有任何工作。
我的代碼是:

main_activity.xml:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:id="@+id/container" 
    android:layout_height="match_parent" 
    tools:context="com.example.pc.fkidshell.Teen5Activity"> 

    <ListView 
     android:id="@+id/list" 
     android:layout_height="wrap_content" 
     android:layout_width="fill_parent" 
     android:layout_weight="1"/> 
    <Button 
     android:id="@+id/btn_add2" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:layout_marginBottom="20dp" 
     android:text="Add Selected Apps" 
     android:width="170dp" 
     android:layout_weight="2" 
     android:layout_alignParentBottom="true" 
     android:layout_gravity="center_horizontal" /> 
</FrameLayout> 

inflator.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> 

Datamodel.java

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; 
    } 

} 

Adapter.java:(在複選框監聽器我正在使用「MyApplication.setMyapps(ss);」來分配應用程序nam E要我的全局類(MyApplication的)可變的ArrayList安裝MyApps)

public class Adapter extends BaseAdapter { 
    Context _ctx; 
    LayoutInflater inflater; 
    public ArrayList<Datamodel> data; 

    public Adapter(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 CompoundButton.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); 
       MyApplication.setMyapps(ss); 
      } 
     }); 
     return itemView; 
    } 
} 

Mainactivity.java:

public class Teen5Activity extends Activity 
{ 
    private ListView list; 
    ArrayList<Datamodel> res; 
    Adapter _adapter; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_teen5); 

     list = (ListView) findViewById(R.id.list); 
     List<PackageInfo> _myapps = getPackageManager().getInstalledPackages(0); //all the list of apps pacakage info stores in _myapps 
     res = new ArrayList<Datamodel>(); //new arraylist that contains appname and checkboxes status 
     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 Adapter(getApplicationContext(), res); 
     _adapter.notifyDataSetChanged(); 
     list.setAdapter(_adapter); 
     Button addbtn=(Button) findViewById(R.id.btn_add2); 
     addbtn.setOnClickListener(new View.OnClickListener() 
     { 
      @Override 
      public void onClick(View v) 
      { 
       if((MyApplication.getMyapps())==null) 
       { 
        Toast.makeText(getApplicationContext(), "Nothing to ADD!", Toast.LENGTH_LONG).show(); 
       } 
       else 
       { 
        Toast.makeText(getApplicationContext(), "Successfully Added your Apps!", Toast.LENGTH_LONG).show(); 
       } 

      } 
     }); 
    } 
} 

MyApplication.java:

public class MyApplication extends Application 
{ 
    private static ArrayList<String> myapps=null; 
    public static void setMyapps(String logo) 
    { 
     myapps.add(logo); 
    } 
    public static ArrayList<String> getMyapps() 
    { 
     return myapps; 
    } 

} 

回答

0

如下錯誤我能找到你的代碼:

1)您需要初始化您的MyApplication類的myApps arraylist.If你tr y在不初始化arrayList的情況下調用setMyApps,您將得到一個空指針異常。您還需要一個刪除方法來動態更新您的checked-apps列表。

public class MyApplication extends Application 
{ 
private static ArrayList<String> myapps= new ArrayList<String>();//Create an instance of the list, don't keep it as null 

public static void setMyapps(String logo) 
{ 
    myapps.add(logo); 
} 
public static ArrayList<String> getMyapps() 
{ 
    return myapps; 
} 
public static void removeApp(String appName) 
{ 
    myapps.remove(appName); 
} 

} 

2)你需要將它添加到你的列表中,只有如果它被選中,而不是虛假的狀態。因此,無論何時,您訪問該列表時,出現的元素都是指已選中的應用程序。此外,您還需要從列表中刪除應用程序名稱,以檢查是否出現以及未選中的情況。

checks.setOnCheckedChangeListener(new CompoundButton.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); 
      if(isChecked) //Only if the app is checked 
       MyApplication.setMyapps(ss); 
      else if(MyApplication.getMyApps().contains(ss)) 
       MyApplication.removeApp(ss); 
     } 
    }); 

3)我不知道你爲什麼在這裏延伸,從應用程序的所有MyApplication類,如果你的目標是來存儲應用名稱..一個簡單的字符串數組列表就足夠了。

4)最好通過軟件包名稱而不是應用程序名稱來跟蹤應用程序,因爲軟件包名稱是該應用程序的一個更獨特的屬性。

+0

謝謝..它的工作 – Iqra

+0

很高興幫助你:) – SoulRayder

0

您從不檢查是否實際選中了複選框,只添加項目,而不管複選框是否被選中。

@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); 
    MyApplication.setMyapps(ss); 
} 

試着這麼做

@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(); 
    if (isChecked) { 
     // TODO: if your apps does not contain 'ss' already { 
      MyApplication.setMyapps(ss); 
     // } 
    } else { 
     // TODO: Remove ss from your apps 
    } 
} 

你大概可以存儲List<DataModel>在你的應用程序,而不是,如果你真的想要的,而不是字符串。

你也可以使用一個Set對象,而不是一個ArrayList,以防止重複

0

您可以通過您的ArrayList循環,並選擇具有isSelected()項爲真:很多

ArrayList<String> selectedApps = new ArrayList<String>(); 
for(Datamodel app : res) { 
    if(app.isSelected()) 
     selectedApps.add(app.getAppname()); 
}