删除ArrayAdapter和listview中的复选框项

时间:2013-08-18 16:29:45

标签: android listview android-arrayadapter

我创建了一个应用程序,以两种语言显示国家/地区的名称,以及用于上下文操作模式的复选框。 删除所选项目后,复选框会自动选中下一项。

我尝试覆盖getcount,但它不起作用。

我的代码:

MyCountry.java

public class MyCountry {
private String nameEn;
private String nameVi;
private Drawable flag;
private boolean isCheck;
public String getNameEn() {
    return nameEn;
}
public void setNameEn(String nameEn) {
    this.nameEn = nameEn;
}
public String getNameVi() {
    return nameVi;
}
public void setNameVi(String nameVi) {
    this.nameVi = nameVi;
}
Drawable getFlag() {
    return flag;
}
void setFlag(Drawable flag) {
    this.flag = flag;
}
public MyCountry(String nameEn, String nameVi, Drawable flag) {
    // TODO Auto-generated constructor stub
    this.nameEn = nameEn;
    this.nameVi = nameVi;
    this.flag = flag;
}
public boolean isCheck() {
    return isCheck;
}
public void setCheck(boolean isCheck) {
    this.isCheck = isCheck;
}

}

CountryAdapter.java

public class CountryAdapter extends ArrayAdapter<MyCountry>{
Context context;
int layoutResourceId;
ArrayList<MyCountry> countries;
ContextualActionMode activity;
public CountryAdapter(Context context, int layoutResourceId,
        ArrayList<MyCountry> countries) {
    super(context, layoutResourceId, countries);
    // TODO Auto-generated constructor stub
    this.context = context;
    this.countries = countries;
    this.layoutResourceId = layoutResourceId;
    activity = (ContextualActionMode) context;
}
@Override
public int getCount() { 
    return countries.size();
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    // TODO Auto-generated method stub
    //View v;
    final MyCountry country = countries.get(position);
    ViewHolder viewHolder = null;
    if(convertView == null) 
    {
        viewHolder = new ViewHolder();
        //bươc 1: khoi tao doi tuong layoutInflater
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = inflater.inflate(layoutResourceId, null);
        viewHolder.nameEn = (TextView) convertView.findViewById(R.id.tvNameEn);
        viewHolder.nameVi = (TextView) convertView.findViewById(R.id.tvNameVi);
        viewHolder.flag = (ImageView) convertView.findViewById(R.id.ivFlag);
        viewHolder.check = (CheckBox) convertView.findViewById(R.id.checkBox1);
        convertView.setTag(viewHolder);
    }
    else 
        viewHolder = (ViewHolder) convertView.getTag();
    viewHolder.nameEn.setText(countries.get(position).getNameEn());
    viewHolder.nameVi.setText(countries.get(position).getNameVi());
    viewHolder.flag.setImageDrawable(countries.get(position).getFlag());
    viewHolder.check.setOnCheckedChangeListener(new OnCheckedChangeListener() {
        @Override
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
            // TODO Auto-generated method stub
            count = 0;
            for (MyCountry country : countries) {
                if(country.isCheck())
                    count++;
            }
            if(isChecked)
            {
                if(activity.actionMode == null || count == 0)//chua co
                activity.actionMode = activity.startActionMode(activity.callback);
                count++;
                country.setCheck(true);
            }
            else
            {
                country.setCheck(false);
                count--;
                if(count == 0)
                activity.actionMode.finish();
            }
        }
    });
    return convertView;
}
int count = 0;
public class ViewHolder{
    TextView nameEn;
    TextView nameVi;
    ImageView flag;
    CheckBox check;
}

}

ContextualActionMode.java

public class ContextualActionMode extends Activity {

ArrayList<MyCountry> countries = new ArrayList<MyCountry>();
ListView listView;
CountryAdapter adapter;


ActionMode.Callback callback = new ActionMode.Callback() {

    @Override
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onDestroyActionMode(ActionMode mode) {
        // TODO Auto-generated method stub

    }

    @Override
    public boolean onCreateActionMode(ActionMode mode, Menu menu) {
        // TODO Auto-generated method stub
        getMenuInflater().inflate(R.menu.floating_menu, menu);
        return true;
    }
    @Override
    public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
        // TODO Auto-generated method stub

        switch (item.getItemId()) {
        case R.id.mnDelete:
            //for(int i = countries.size()-1; i >= 0; i--)
            for (int i = 0; i < countries.size(); i++)
            {
                if (countries.get(i).isCheck()) {

                    countries.remove(countries.get(i));

                }

            }

            adapter.notifyDataSetChanged();
            mode.finish();
            return true;
        default:
            break;
        }
        return false;
    }
};


ActionMode actionMode;

void initData() {
    String[] arrNameVi = getResources().getStringArray(R.array.nameVi);
    String[] arrNameEn = getResources().getStringArray(R.array.nameEn);
    TypedArray arrFlag = getResources().obtainTypedArray(
            R.array.country_flag);
    //Boolean[] checkbox=getResources().
    for (int i = 0; i < arrNameEn.length; i++)
        countries.add(new MyCountry(arrNameEn[i], arrNameVi[i], arrFlag
                .getDrawable(i)));

}

@Override
protected void onCreate(Bundle savedInstanceState) {
    // TODO Auto-generated method stub
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    initData();
    listView = (ListView) findViewById(R.id.listView1);
    adapter = new CountryAdapter(this, R.layout.item_listview_layout,
            countries);

    listView.setAdapter(adapter);

    listView.setOnItemLongClickListener(new OnItemLongClickListener() {

        @Override
        public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
                int position, long arg3) {
            // TODO Auto-generated method stub
            actionMode = startActionMode(callback);
            actionMode.setTag(position);
            return false;
        }
    });
}

}

这里可能有问题

case R.id.mnDelete:
            //for(int i = countries.size()-1; i >= 0; i--)
            for (int i = 0; i < countries.size(); i++)
            {
                if (countries.get(i).isCheck()) {
                 countries.remove(countries.get(i));    
                }

            }

            adapter.notifyDataSetChanged();
            mode.finish();

0 个答案:

没有答案