2017-03-17 72 views
-1

我正在开发一个项目,并且希望从列表视图中获取所选项目的复选框(复选框)。 有没有办法做到这一点? 目前为止的代码如下;在列表视图中查找选中的复选框Android

主要活动

import android.os.Bundle; 
import android.app.Activity; 
import android.view.Menu; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.ListView; 
public class MainActivity extends Activity { 
    ListView lv; 
    Model[] modelItems; 
    CheckBox ONE,TWO,THREE; 
    Button MultiData; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lv = (ListView) findViewById(R.id.listView1); 

     modelItems = new Model[5]; 
     modelItems[0] = new Model("pizza", 0); 
     modelItems[1] = new Model("burger", 0); 
     modelItems[2] = new Model("olives", 0); 
     modelItems[3] = new Model("orange", 0); 
     modelItems[4] = new Model("tomato", 0); 
     CustomAdapter adapter = new CustomAdapter(this, modelItems); 
     lv.setAdapter(adapter); 

    } 

} 

CustomAdapter

import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.TextView; 

import java.util.ArrayList; 

public class CustomAdapter extends ArrayAdapter { 
    Model[] modelItems = null; 
    Context context; 

    public CustomAdapter(Context context, Model[] resource) { 
     super(context, R.layout.row1, resource); 
     this.context = context; 
     this.modelItems = resource; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.row1, parent, false); 
     TextView name = (TextView) convertView.findViewById(R.id.textView1); 
     CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 
     name.setText(modelItems[position].getName()); 
     if (modelItems[position].getValue() == 1) 
      cb.setChecked(true); 
     else 
      cb.setChecked(false); 
     return convertView; 
    } 
} 

模型

public class Model{ 
    String name; 
    int value; /* 0 -> checkbox disable, 1 -> checkbox enable */ 

    Model(String name, int value){ 
     this.name = name; 
     this.value = value; 
    } 
    public String getName(){ 
     return this.name; 
    } 
    public int getValue(){ 
     return this.value; 
    } 

} 

main_xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 
    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" > 
    </ListView> 
</LinearLayout> 

row1.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="match_parent" 
    android:orientation="horizontal" > 
    <CheckBox 
     android:id="@+id/checkBox1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="" /> 
    <TextView 
     android:id="@+id/textView1" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="TextView" /> 
</LinearLayout> 

Eidt1在主要活动

boolean modelItemBool[] = new boolean[modelItems.length]; 
     for (int h =0;h<modelItemBool.length;h++){ 
      modelItemBool[h] = false; 
     } 

Eidt 2

@Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.row1, parent, false); 
     TextView name = (TextView) convertView.findViewById(R.id.textView1); 
     CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 
     name.setText(modelItems[position].getName()); 

     cb.setOnCheckedChangeListener(new 
      CompoundButton.OnCheckedChangeListener() { 
       @Override 
       public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
        if(isChecked){ 
         modelItems[position].getValue() == 1; 
        }else{ 
         modelItems[position].getValue() == 0; 
        } 
       } 
      }); 
     return convertView; 
    } 
+0

你必须记录检查位置,一旦他们得到遏制,在听众进行更新。您不能从ListView中获取所有视图,因为它们正在被重用。 –

+2

可能重复的[使用列表视图中的复选框获取选定的项目](http://stackoverflow.com/questions/18162931/get-selected-item-using-checkbox-in-listview) –

+0

@VladMatvienko我怎样才能'记录检查一旦他们被检查了吗? – user6750923

回答

0

试试这个

创建布尔数组与您modelItems大小和阵列中的1号店真假值

步骤:默认存储的所有值阵列假

第2步:数组更新值复选框检查状态变化

+0

请添加代码。 – user6750923

+0

我已经添加了这个'boolean modelItemBool [] = new boolean [modelItems.length]; for(int h = 0; h user6750923

+0

@Mahul Gajjar我该如何实现Step2? – user6750923

0
  • 新保持选定的项目清单:

    List<Model> selectedList = new ArrayList<>(); 
    
    private List getSelectedList(){ 
        if(!selectedList.isEmpty()) selectedList.clear(); 
        for (int i=0;i<array.length;i++){ 
         if(modelItems [i].getValue==1){ 
          selectedList.add(modelItems [i]); 
         } 
        } 
        return selectedList; 
    } 
    
  • getView设置onCheckedChangeListenerCheckBox

    cb.setOnCheckedChangeListener(new 
    
        CompoundButton.OnCheckedChangeListener() { 
         @Override 
         public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
          if(isChecked){ 
           modelItems[position].setValue(1); 
          }else{ 
           modelItems[position].setValue(0); 
          } 
         } 
        }); 
    
+0

我应该在哪里添加代码?在主要活动? – user6750923

+0

将第一步添加到MainActivity中,将第二步添加到Adapter中的getView方法。当你想要selectedList只是调用方法'getSelectedList()'。 – xiaoyuan

+0

我在'getView'中添加了step2,并将android的位置更改为final。但是它给出'modelItems [position] .getValue()== 1;'行上的错误''请参阅编辑问题 – user6750923

0

回报convertView之前添加以下代码;然后modelItems阵列将每一个复选框被选中时/未选中

final int posFinal = position; 
     cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
       modelItems[posFinal].setValue(b ? 1 : 0); 
      } 
     }); 
+0

'modelItems [posFinal] .getValue()'返回整数。〜〜 – xiaoyuan

+0

modelItems [posFinal] .setValue(b?1:0); –

+0

@ Tonteria24如何获取MainActivty中的modelItems数组按钮单击?我在MainActivity中需要它。 – user6750923

0
// Replace your code with bellow, on the click of button it will show selected checkbox name in alert dialog. 
// MainActivity 
import android.app.Activity; 
import android.app.AlertDialog; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.ListView; 

public class MainActivity extends Activity { 
    ListView lv; 
    Model[] modelItems; 
    Button btn; 
    String selectedCheckBoxNAme = ""; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main_xml); 
     lv = (ListView) findViewById(R.id.listView1); 
     btn = (Button)findViewById(R.id.btn) ; 
     modelItems = new Model[5]; 
     modelItems[0] = new Model("pizza", 0); 
     modelItems[1] = new Model("burger", 0); 
     modelItems[2] = new Model("olives", 0); 
     modelItems[3] = new Model("orange", 0); 
     modelItems[4] = new Model("tomato", 0); 
     CustomAdapter adapter = new CustomAdapter(this, modelItems); 
     lv.setAdapter(adapter); 

     btn.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       selectedCheckBoxNAme = ""; 
       for (int i = 0; i < modelItems.length; i++) { 
        Model obj= modelItems [i]; 
        if(obj.getValue() == 1) 
        { 
         selectedCheckBoxNAme = selectedCheckBoxNAme +"\n" + obj.getName(); 
        } 
       } 
       if(!selectedCheckBoxNAme.isEmpty()) { 
        new AlertDialog.Builder(MainActivity4.this).setTitle("").setMessage(selectedCheckBoxNAme) 
          .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { 

           @Override 
           public void onClick(DialogInterface dialog, 
                int which) { 
           } 
          }) 
          .setCancelable(false).create().show(); 
       } 
      } 
     }); 
    } 
} 
// CustomAdapter.java 
import android.app.Activity; 
import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.TextView; 

public class CustomAdapter extends ArrayAdapter { 
    Model[] modelItems = null; 
    Context context; 

    public CustomAdapter(Context context, Model[] resource) { 
     super(context, R.layout.row1, resource); 
     this.context = context; 
     this.modelItems = resource; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     convertView = inflater.inflate(R.layout.row1, parent, false); 
     TextView name = (TextView) convertView.findViewById(R.id.textView1); 
     CheckBox cb = (CheckBox) convertView.findViewById(R.id.checkBox1); 
     name.setText(modelItems[position].getName()); 
     if (modelItems[position].getValue() == 1) 
      cb.setChecked(true); 
     else 
      cb.setChecked(false); 

     cb.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      if (((CheckBox) v).isChecked()) { 
      modelItems[position].setValue(1); 
      }else{ 
      modelItems[position].setValue(0); 
      } 
     } 
     }); 
     return convertView; 
    } 

} 
//main_xml.xml 
<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
       android:layout_width="fill_parent" 
       android:layout_height="wrap_content" 
       > 
    <ListView 
     android:id="@+id/listView1" 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_above="@+id/btn"> 
    </ListView> 

    <Button 
     android:id="@+id/btn" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Click Here" 
     android:layout_centerHorizontal="true" 
     android:layout_alignParentBottom="true"/> 
</RelativeLayout> 

// Model 
public class Model { 
    String name; 
    int value; /* 0 -&gt; checkbox disable, 1 -&gt; checkbox enable */ 

    Model(String name, int value){ 
     this.name = name; 
     this.value = value; 
    } 
    public String getName(){ 
     return this.name; 
    } 
    public int getValue(){ 
     return this.value; 
    } 

    public void setValue(int value) 
    { 
     this.value = value; 
    } 
} 
相关问题