2011-04-24 22 views
0

我有一個列表和ArrayAdapter可以顯示它(基本上作爲CheckBox的列表)。 MyObejct只有幾個字段,其中一個是啓用布爾值的。ListView與ArrayAdapter:點擊複選框時的更新模型

我該怎麼做,點擊CheckBox會改變相應的模型?喜歡的東西:

public class MyObjectAdapter extends ArrayAdapter<MyObject>{ 

    private List<MyObject> items; 

    public MyObjectAdapter(Context context, int textViewResourceId, List<MyObject> objects) { 
     super(context, textViewResourceId, objects); 

     this.items = objects; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View v = convertView; 
     if (v == null) { 

      LayoutInflater vi = (LayoutInflater) getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      v = vi.inflate(R.layout.myobject_checkbox, null); 
     } 
     MyObject myobject = items.get(position); 

     if (myobject!=null){ 
      //checkbox 
      CheckBox cbEnabled = (CheckBox) v.findViewById(R.id.enabled); 
      if(cbEnabled != null){ 
       cbEnabled.setChecked(myobject.isEnabled()); 
       cbEnabled.setText(myobject.getName()); 
       cbEnabled.setTag(position); 
       cbEnabled.setOnClickListener(new OnClickListener() { 
        public void onClick(View v) { 
        //how change model. E.g. myobject.setEnabled(((CheckBox) v).isChecked()) 
        } 
       }); 
      } 
     } 

     return v; 
    } 
} 
+0

你能在這裏發佈更多的代碼,即您的Adapte R' – 2011-04-24 12:03:50

回答

1

的方式,我會處理這個問題是使該初始化列表視圖的方法,一旦任何改變,它被重新初始化。

執行CALL像每一個在列表視圖中的條目的變化,否則讓你想

setListAdapter(new ArrayAdapter<String>(this, R.layout.myLayout, myVector)); 

不過據我所知,這可能與其它方法相比多所社區可以使用在計算上昂貴的它出現的時間如下

0

您需要在適配器上調用notifyDataSetChanged()方法。這將告訴ListView,底層數據模型已更改,並且需要更新。沒有必要創建一個新的適配器,只需更新其中的項目,然後調用我提到的方法。

+1

此外,請注意ListViews內的複選框,您是否希望ListItem和Checkbox都可點擊?這通常是不鼓勵的(但並非不可能完成)。處理這個問題的最好方法是擁有一個ItemOnClickListener,當他們點擊ListItem時,然後更新複選框視圖進行檢查。 – dmon 2011-04-24 16:23:49

+0

只有可點擊複選框就足夠了。但我在哪裏更新MyObject(myobject.setEnabled(布爾))?請問,請給出代碼示例? – 2011-04-24 23:29:56

+0

對,請查看(http://developer.android.com/guide/topics/ui/binding.html),查找處理用戶選擇。您可以使用OnItemClickListener的onClick方法更新對象的模型。在它中,使用適配器變量來檢索你的對象(adapter.getItem(position))並在那裏設置啓用標誌。 此外,如果您遇到焦點問題,請參閱此問題:http://stackoverflow.com/questions/1518338/setonitemclicklistener-not-working-on-custom-listview-android – dmon 2011-04-24 23:41:00

0

這裏是工作示例。我在一個項目實施

activity_main.xml中

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:paddingBottom="@dimen/activity_vertical_margin" 
    android:paddingLeft="@dimen/activity_horizontal_margin" 
    android:paddingRight="@dimen/activity_horizontal_margin" 
    android:paddingTop="@dimen/activity_vertical_margin" 
    tools:context=".MainActivity" > 

    <Button android:id="@+id/checkAll" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Select All"/> 

    <Button android:id="@+id/uncheckAll" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Unselect All" 
     android:layout_toRightOf="@id/checkAll"/> 

    <ListView 
     android:id="@+id/listView" 
     android:layout_below="@id/checkAll" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content"> 

    </ListView> 

</RelativeLayout> 

checkboxrow.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="vertical" > 

    <CheckBox android:id="@+id/checkBox" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:checked="true"/> 

</LinearLayout> 

MainActivity.java

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.CheckBox; 
import android.widget.ListView; 

public class MainActivity extends Activity { 

    private ListView listView; 
    private Boolean checkAll=false; 
    private MySimpleArrayAdapter adapter; 
    private Button buttoncheckAll; 
    private Button buttonuncheckAll; 

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

     listView=(ListView)findViewById(R.id.listView); 

     String[] array={"one","two","three","four","five"}; 


     adapter = new MySimpleArrayAdapter(MainActivity.this, array); 

     listView.setAdapter(adapter); 
     listView.setItemsCanFocus(false); 
      listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE); 

     buttoncheckAll=(Button)findViewById(R.id.checkAll); 
     buttoncheckAll.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       checkAll=true; 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

     buttonuncheckAll=(Button)findViewById(R.id.uncheckAll); 
     buttonuncheckAll.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       checkAll=false; 
       adapter.notifyDataSetChanged(); 
      } 
     }); 
    } 

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

    class MySimpleArrayAdapter extends ArrayAdapter<String> { 
      private final Context context; 
      private final String[] values; 

      public MySimpleArrayAdapter(Context context, String[] values) { 
      super(context, R.layout.checkboxrow, values); 
      this.context = context; 
      this.values = values; 
      } 

      @Override 
      public View getView(int position, View convertView, ViewGroup parent) { 
      LayoutInflater inflater = (LayoutInflater) context 
       .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      View rowView = inflater.inflate(R.layout.checkboxrow, parent, false); 
      CheckBox checkbox=(CheckBox)rowView.findViewById(R.id.checkBox); 
      checkbox.setText(values[position]); 
      if(checkAll){ 
       checkbox.setChecked(true); 
      }else{ 
       checkbox.setChecked(false); 
      } 

      return rowView; 
      } 
     } 
} 

好運:)