2016-09-26 13 views
2

私はアンドロイドで予定リストアプリを作っています。私はプログラムで設定することはできませんListViewのチェックボックスを持っている以外はすべてがうまく動作しています。私は自分のタスクを保存しているSQLiteデータベースを使用していて、完全であるとマークされているかどうかはわかりません。チェックボックスをチェックすると、データベースに "1"が正常に保存されます。私はデータベースから自分のタスクのテキストを読み込んで表示するupdateUIメソッドを持っています。チェックボックスのUIの更新を処理する新しいupdateUICheckBoxメソッドを作成しました。今私はすべてのチェックボックスをチェックするように設定しようとしていますが、setChecked(true)を呼び出すとnullpointerexceptionが発生します。AndroidのListView CheckBoxへのアクセス

// not working 
private void updateUICheckBox() { 
    CheckBox c = (CheckBox) findViewById(R.id.list_complete_check_box); 
    c.setChecked(true); // null pointer exception 
} 
+0

http://stackoverflow.com/a/10896140/726863 –

答えて

1

CheckBoxを設定するListViewアイテムなので、ListView自体のアダプタで設定する必要があります。また、データモデルを操作してCheckBoxをチェックするかチェックを外します。

ListViewを作成するためにBaseAdapterを拡張して新しいクラスを作成します。あなたは

+0

BaseAdapterを拡張する内部クラスを追加しました(上記の編集を参照)。私はgetViewメソッドを埋めました。 updateUICheckBoxメソッドでこれを利用して、データベース値に応じてチェックボックスを設定するにはどうすればよいですか? –

+0

実装についてはこれを確認してくださいhttp://stackoverflow.com/questions/5457699/cursor-adapter-and-sqlite-example –

1

はあなたのリストにフラグを追加してみ管理するために、1つの以上のUIオブジェクトにカスタムレイアウトをしている場合ArrayAdapterを使用しないでください

public class Country { 
    public String name; 
    public String code; 
    public String abbreviation; 
    public boolean selected = false; //--> example this flag 
    public int image; 
} 

アダプタを変更したい

public class CountryCodeAdapter extends BaseAdapter { 
    private Context context; 
    private List<Country> countryList; 


    public CountryCodeAdapter(Context context, List<Country> countryList) { 
     this.context = context; 
     this.countryList = countryList; 
    } 

    @Override 
    public int getCount() { 
     return countryList.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return countryList.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder viewHolder; 
     if (convertView == null) { 
      convertView = LayoutInflater.from(context).inflate(R.layout.adapter_country_code, parent, false); 
      viewHolder = new ViewHolder(convertView); 
      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     Country country = countryList.get(position); 
     viewHolder.tv_item_country_name.setText(country.getName()); 

     String plus = context.getResources().getString(R.string.plus); 
     viewHolder.tv_item_country_code.setText(plus.concat(country.getCode())); 
     int image = country.getImage(); 
     if (image != -1) { 
      viewHolder.iv_item_country.setImageResource(image); 
     } 

     return convertView; 
    } 

    public void updateList(List<Country> countryList) { 
     this.countryList = countryList; 
     notifyDataSetChanged(); 
    } 

    static class ViewHolder { 
     @Bind(R.id.iv_item_country) 
     ImageView iv_item_country; 
     @Bind(R.id.tv_item_country_name) 
     TextView tv_item_country_name; 
     @Bind(R.id.tv_item_country_code) 
     TextView tv_item_country_code; 

     public ViewHolder(View view) { 
      ButterKnife.bind(this, view); 
     } 
    } 
} 

フラグの場合は、アダプタの外でこれを実行します。

CountryCodeAdapter adapter = new CountryCodeAdapter(activity, countryList); 
//eg. you may change the 1st element in countryList selected flag into true and //call updateList 
     if (adapter != null) { 
      adapter.updateList(countryList); 
     } 

このフラグを使用して、アダプタ内のチェックボックスを設定します。

関連する問題