2013-09-26 3 views
6

Привет, я создал список с флажками в нем ... , но я не знаю, как получить выбранный флажок. Вот код activity_main.xmlAndroid получить текст всех отмеченных флажков в listView

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/LinearLayout1" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:gravity="top" 
    android:orientation="vertical" 
    tools:context=".MygamesActivity" > 

    <ListView 
     android:id="@android:id/list" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:layout_marginTop="20dp" /> 

</LinearLayout> 

другая компоновка, которая имеет флажки, чтобы показать в списке следует main.list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"> 
    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="CheckBox" 
     /> 
</LinearLayout> 

и это класс, который расширяет arrayadapter

package com.wasiff.listview; 

import android.content.Context; 
import android.content.res.TypedArray; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.ImageView; 
import android.widget.TextView; 


public class CheckboxAdapter extends ArrayAdapter<String> { 
    private LayoutInflater mInflater; 

    private String[] mStrings; 
    private TypedArray mIcons; 
    private int mViewResourceId; 

    public CheckboxAdapter(Context ctx,int viewResourceId,String[] strings){ 
     super(ctx,viewResourceId,strings); 

     mInflater = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

     mStrings = strings; 

     mViewResourceId = viewResourceId; 
    } 

    public int getCount(){ 
     return mStrings.length; 
    } 

    public String getItem(int position){ 
     return mStrings[position]; 
    } 

    public long getItemId(int position){ 
     return 0; 
    } 

    public View getView(int position,View convertView,ViewGroup parent){ 
     convertView = mInflater.inflate(mViewResourceId, null); 

     CheckBox tv = (CheckBox)convertView.findViewById(R.id.checkBox1); 
     tv.setText(mStrings[position]); 

     return convertView; 
    } 
} 

и это мой mainActivity класс

package com.wasiff.listview; 

import android.app.ListActivity; 
import android.content.Context; 
import android.content.res.Resources; 
import android.content.res.TypedArray; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.View; 
import android.widget.AdapterView.OnItemClickListener; 
import android.widget.Button; 
import android.widget.ListAdapter; 
import android.widget.ListView; 

public class MainActivity extends ListActivity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Context ctx = getApplicationContext(); 
     Resources res = ctx.getResources(); 

     String[] options = res.getStringArray(R.array.countrynames); 

     setListAdapter((ListAdapter) new CheckboxAdapter(ctx,R.layout.main_list_item,options)); 

    } 



    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.main, menu); 
     return true; 
    } 

} 

и, наконец, я спас все страны в файле countries.xml на папке значений

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <string-array name="countrynames" translatable="false"> 
     <item>Bhutan</item> 
     <item>Colombia</item> 
     <item>India</item> 
     <item>Pakistan</item> 
     <item>Australia</item> 
     <item>Srilanka</item> 
     <item>England</item> 
    </string-array> 
</resources> 

он показывает флажки в ListView в настоящее время то, что я хочу, это получить текст флажков, которые были отмечены, и показать в тосте нажатием кнопки (чтобы проверить). Я следил за учебником по cookbook для Android от oreilly, но все же я не знаю, как установить слушателя.

ответ

18

Добавить в CheckboxAdapter.java

ArrayList<String> selectedStrings = new ArrayList<String>(); 

Тогда внутри метода GetView

tv.setOnCheckedChangeListener(new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       if (isChecked) { 
        selectedStrings.add(tv.getText().toString()); 
       }else{ 
        selectedStrings.remove(tv.getText().toString()); 
       } 

      } 
     }); 

Написать поглотитель, который возвратит selectedStrings

ArrayList<String> getSelectedString(){ 
    return selectedStrings; 
} 
+1

Спасибо за его работу :) –

+0

Проблема с решением заключается в том, что он не поддерживает порядок флажков –

+0

внутри onCheckedChanged использует buttonView.getText вместо tv.getText – temirbek

1

На подходе можно было бы передать свой объект в свой Arrayadapter:

class ArrayItem{ 
    private String text; 
    private boolean checked; 
    ... (getter/setter) 
} 

и просто получить использованную массив обратно из Arrayadapter и прочитать его.

Arrayadaper...{ 

    public ArrayList<ArrayItem> getList(){ 
     return this.arrayList; 
    } 

    public View getView(int position,View convertView,ViewGroup parent){ 
     ArrayItem item = this.arrayList.get(position) 
     convertView = mInflater.inflate(mViewResourceId, null); 

     CheckBox tv = (CheckBox)convertView.findViewById(R.id.checkBox1); 
     tv.setCheckChangeListener... //item.setChecked(true:false) 
     tv.setText(mStrings[position]); 

     return convertView; 
    } 
} 


} 

Вы можете Переберите в список и просто манипулировать элементы, где проверяются == истинный

Надеется, что это помогает.

13

Может быть, это будет Вам помог:

CheckBox cb; 
    ListView mainListView = getListView(); 
    for (int x = 0; x<mainListView.getChildCount();x++){ 
     cb = (CheckBox)mainListView.getChildAt(x).findViewById(R.id.myCheckBox); 
     if(cb.isChecked()){ 
      doSomething(); 
     } 
    } 
+0

Мне очень нравится этот! –

+0

@Saif Hamed Это работает для меня ... –

+0

Это будет работать только для видимых элементов в списке. – c0m4

0
SparseBooleanArray checked = listView1.getCheckedItemPositions(); 
       ArrayList<String> selectedItems = new ArrayList<String>(); 

       for (int i = 0; i < len; i++) { 
        if (checked.get(i)) 
         selectedItems.add((String) adapter.getItem(i)); 
       } 
       String[] outputStrArr = new String[selectedItems.size()]; 

       for (int i = 0; i < selectedItems.size(); i++) { 
        outputStrArr[i] = selectedItems.get(i); 
       } 
Смежные вопросы