2013-09-26 180 views
6

Xin chào tôi đã tạo một listview có hộp kiểm trong đó ... nhưng tôi không biết cách lấy văn bản hộp kiểm được chọn .. đây là mã activity_main.xmlAndroid nhận được văn bản của tất cả các hộp kiểm được chọn trong 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> 

khác bố trí trong đó có hộp kiểm để hiển thị trong listview 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> 

và đây là lớp mà kéo dài 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; 
    } 
} 

và đây là lớp MainActivity tôi

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

} 

và cuối cùng tôi đã tất cả các nước lưu trong một tập tin vào thư mục countries.xml giá trị

<?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> 

nó cho thấy các hộp kiểm trong ListView nay những gì tôi muốn là để có được các văn bản của các hộp kiểm được kiểm tra và hiển thị trong một bánh mì nướng trên một nút bấm (để kiểm tra) i theo hướng dẫn trên sách dạy nấu ăn android bởi oreilly nhưng tôi vẫn không biết làm thế nào để thiết lập người nghe

Trả lời

18

Thêm bên CheckboxAdapter.java

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

Sau đó, bên trong phương pháp 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()); 
       } 

      } 
     }); 

Viết một getter mà sẽ trở lại selectedStrings

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

Cảm ơn làm việc của nó :) –

+0

Vấn đề với giải pháp là nó không duy trì thứ tự của hộp kiểm tra –

+0

bên trong onCheckedChang sử dụng buttonView.getText thay vì tv.getText – temirbek

1

On cách tiếp cận có thể để vượt qua một đối tượng riêng để Arrayadapter của bạn:

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

và chỉ nhận được Array sử dụng trở lại từ Arrayadapter và đọc nó.

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


} 

Bạn có thể lặp qua danh sách và chỉ cần thao tác các mặt hàng nơi kiểm tra == true

Hope this helps.

13

Có thể điều này sẽ giúp bạn:

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

Tôi thực sự thích cái này! –

+0

@Saif Hamed Nó làm việc cho tôi ... –

+0

Điều này sẽ chỉ hoạt động cho các mục có thể nhìn thấy trong danh sách. – 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); 
       }