`
yehoubin
  • 浏览: 24066 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

重写dialog,CursorAdapter实现带多选的ListView

阅读更多
public class ContactDialog2 extends Dialog {

private Context mContext;
private Cursor mCursor;
private final Map<Integer, CheckBox> checkBoxs = new HashMap<Integer, CheckBox>();;
private final LayoutInflater mInflater; //用于实例化一个layout对象

private ContactAdapter mContactAdapter;
private int dataCount;
private boolean[] checks;

public ContactDialog2(Context context, int theme) {
super(context, theme);
mContext = context;
mInflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
init();
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

View view = mInflater.inflate(R.layout.contact_dialog, null);

ListView mListView = (ListView) view.findViewById(R.id.mListView);
mListView.setAdapter(mContactAdapter);


Button allButton = (Button) view.findViewById(R.id.all_button);
allButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int size = checkBoxs.size();
StringBuilder sb = new StringBuilder() ;
for (int i = 0; i < dataCount; i++) {
CheckBox checkBox = checkBoxs.get(i) ;
if (i < size) {
checkBox.setChecked(true);
sb.append(checkBox.getText()).append(", ") ;
}

if (i >= size) {
checks[i] = true;
mCursor.moveToPosition(i) ;
sb.append(mCursor.getString(mCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME))).append(", ") ;
}
}

Log.i("DDDDDDD", sb.toString()) ;
}
});

Button invertButton = (Button) view.findViewById(R.id.invert_button);
invertButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
int size = checkBoxs.size();

StringBuilder sb = new StringBuilder() ;
for (int i = 0; i < dataCount; i++) {
if (i < size) {
CheckBox checkBox = checkBoxs.get(i);

if (checkBox.isChecked()) {
checkBox.setChecked(false);
} else {
checkBox.setChecked(true);
sb.append(checkBox.getText()).append(", ") ;
}
}

if (i >= size) {
if (checks[i] == false) {
checks[i] = true;
mCursor.moveToPosition(i) ;
sb.append(mCursor.getString(mCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME))).append(", ") ;
} else {
checks[i] = false;
}
}
}

if (sb.toString() == "") {
Log.i("fanxuan", "null") ;
}
Log.i("fanxuan", sb.toString()) ;
}
});

Button closeButton = (Button) view.findViewById(R.id.close_button);
closeButton.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
// unregisterReceiver(checksReceiver) ;
ContactDialog2.this.dismiss();
}
});

setContentView(view);
}

private void getContacts() {
// Run query
Uri uri = ContactsContract.Contacts.CONTENT_URI;
String[] projection = new String[] { ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME };
String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP + " = '"
+ "1" + "'";
String[] selectionArgs = null;
String sortOrder = ContactsContract.Contacts.DISPLAY_NAME
+ " COLLATE LOCALIZED ASC";

mCursor = mContext.getContentResolver().query(uri, projection,
selection, selectionArgs, sortOrder);
}

@Override
public void dismiss() {
mCursor.close();
super.dismiss();
}

private void init() {
getContacts();
dataCount = mCursor.getCount();
mContactAdapter = new ContactAdapter(mContext, mCursor);

checks = new boolean[dataCount];
for (int i = 0; i < checks.length; i++) {
checks[i] = false;
}
}
//继承cursorAdapter并重写其中的方法
private class ContactAdapter extends CursorAdapter {

public ContactAdapter(Context context, Cursor c) {
super(context, c);
}

@Override
public void bindView(View view, Context context, Cursor cursor) {
//得到视图中checkBox对象
CheckBox mCheckBox = (CheckBox) view.findViewById(R.id.checkBox);

int position = cursor.getPosition();
String aString = String.valueOf(position);
Log.i("bindView",aString);
//对checkBox对象属性赋值
if (!checkBoxs.containsKey(position)) {
mCheckBox.setText(cursor.getString(cursor
.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
mCheckBox.setChecked(checks[position]);

} else {
mCheckBox.setText(checkBoxs.get(position).getText());
mCheckBox.setChecked(checkBoxs.get(position).isChecked());
checkBoxs.remove(position);
}


checkBoxs.put(position, mCheckBox);
}

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
final View view = mInflater.inflate(R.layout.contact_entry, parent,
false);//找到contact_entry.xml的视图,并把他赋给View
return view;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = newView(mContext, mCursor, parent);
mCursor.moveToPosition(position);
bindView(v, mContext, mCursor);
return v;
}
}
}
分享到:
评论
1 楼 KEIJIjava 2010-11-25  
请加上 xml 文件 以便执行动作检验

相关推荐

    ListView点击item弹出Dialog

    Adapter通常继承自BaseAdapter,例如ArrayAdapter或CursorAdapter,它负责将数据转换为ListView可以显示的View。在适配器中,我们需要重写`getView()`方法,为ListView的每一项创建或复用View,并设置相应的数据。 ...

    自定义单选,多选对话框(android)

    例如,使用`ArrayAdapter`或`CursorAdapter`结合`ListView`来显示单选或多选选项。 4. **事件处理**:为单选按钮和多选按钮设置点击事件监听器,以便在用户做出选择时获取选定的值。同时,设置确认和取消按钮的点击...

    listview有关的

    在Android中,我们通常使用BaseAdapter或者已有的如ArrayAdapter、CursorAdapter等来实现自定义适配器。适配器需要重写`getView()`方法,返回ListView项视图。 3. **ListView的监听器** ListView提供了多种监听器...

    PopupWindow+ListView+在item顶部与底部跳跃

    PopupWindow和ListView是Android开发中常用的两种组件,它们在实现丰富的用户交互时起着关键作用。本篇文章将深入探讨如何将PopupWindow与ListView结合使用,让ListView的item在顶部与底部之间实现动态跳跃效果。 ...

    Android高级应用源码-自定义列表选择Dialog,适用网络请求数据.zip

    在DialogFragment中,你需要重写`onCreateDialog()`方法,使用`AlertDialog.Builder`来构建并返回自定义的Dialog。 3. 设置Adapter:为了将数据展示在ListView中,需要创建一个Adapter,它可以是BaseAdapter的子类...

    DialogFragment和ListFragment使用

    - 内置了ListView,简化了列表的实现。 - 提供了默认的适配器和监听器,方便数据绑定和交互处理。 - 可以通过`setListAdapter()`方法设置适配器来更新列表数据。 - 支持触摸事件处理,如点击和长按。 使用`...

    android自定义Spinner

    然而,标题"android自定义Spinner"表明我们将探讨如何超越默认的显示方式,即避免使用Dialog形式,而是实现一个下拉式的Spinner显示。 1. **Spinner基础知识**: - Spinner是Android SDK中的一个视图组件,属于...

    Android常用控件

    13. **自定义控件**:通过继承现有控件并重写其方法,或者绘制自己的视图,可以创建具有特殊功能或外观的自定义控件。 在源码层面,理解控件的工作原理对于优化性能和解决复杂问题非常关键。例如,深入研究ListView...

    050集-列表对话框和自定义对话框

    3. 实现清单对话框:通过设置Adapter将数据源绑定到DialogFragment的ListView上,如ArrayAdapter或CursorAdapter。 4. 显示对话框:在适当的时候调用DialogFragment的show()方法,传入FragmentManager和标签。 ...

    自定义组合控件之选择对话框

    在XML布局文件中,可以使用`&lt;ListView&gt;`标签来定义,并结合`ArrayAdapter`或`CursorAdapter`填充数据。 接下来,我们需要实现对话框的逻辑。如果使用`AlertDialog`,可以通过`AlertDialog.Builder`来创建并定制...

    一网打尽Android-UI

    开发者通过在菜单XML文件中定义各项,然后在Activity中重写onCreateOptionsMenu()和onOptionsItemSelected()方法来处理用户的选择。 8. **TabWidget(切换卡)**: TabWidget常与ViewPager结合使用,创建可滑动的...

    android UI控件

    这通常通过继承已有的View或 ViewGroup类来实现,然后重写draw()方法和处理触摸事件等。 4. **Adapter和ListView** 当需要显示大量数据时,ListView是常用的控件。它结合了Adapter来动态加载数据,Adapter可以是...

Global site tag (gtag.js) - Google Analytics