如何选择从ArrayList中填充Android的列表视图多个项目 [英] how to select multiple items in a listview populated from ArrayList in Android
问题描述
我试图写一个程序来选择列表视图我填充多个项目。但我有选择多个项目的难度。请让我知道如何做到这一点。贝娄是我怎么也填充ArrayList和我有一个自定义行使用复选框。我需要得到按钮单击事件选定的项目(名称,编号)。先感谢您。我试图了解其他职位,但因为我无法将它们与我的code,我不知道怎么办。
公共类Contactselect延伸活动{
ListView的LV;
的EditText等;
诠释计数;
ArrayList的< HashMap的<字符串,字符串>>名单=新的ArrayList< HashMap的<字符串,字符串>>();
字符串phoneNumber的;
字符串名称;
字符串名称=联系;
字符串手机=PHONENUMBER;
TextWatcher搜索;
SimpleAdapter适配器;
@覆盖
保护无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.contacts);
listcontacts();
LV =(ListView控件)findViewById(R.id.contactlist);
lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE);
lv.setTextFilterEnabled(真正的);
适配器=新SimpleAdapter(这一点,列表,R.layout.row,新的String [] {
姓名,电话},新的INT [] {R.id.names,R.id.numbers});
lv.setAdapter(适配器);
按钮B =(按钮)findViewById(R.id.done);
b.setOnClickListener(新Button.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
字符串选择=;
INT cntChoice = lv.getCount();
SparseBooleanArray sparseBooleanArray = LV
.getCheckedItemPositions();
的for(int i = 0; I< cntChoice;我++){
如果(sparseBooleanArray.get(i))的{
选择+ = lv.getItemAtPosition(I)的ToString()+\ N的;
}
}
Toast.makeText(Contactselect.this,选择,Toast.LENGTH_LONG)
。显示();
}
});
等=(EditText上)findViewById(R.id.search);
et.addTextChangedListener(新TextWatcher(){
@覆盖
公共无效onTextChanged(CharSequence的CS,诠释ARG1,INT ARG2,
INT ARG3){
// TODO自动生成方法存根
。Contactselect.this.adapter.getFilter()过滤器(CS);
}
@覆盖
公共无效beforeTextChanged(CharSequence的arg0中,INT ARG1,
INT ARG2,诠释ARG3){
// TODO自动生成方法存根
}
@覆盖
公共无效afterTextChanged(编辑为arg0){
// TODO自动生成方法存根
}
});
}
私人的ArrayList< HashMap的<字符串,字符串>> listcontacts(){
// TODO自动生成方法存根
的FileInputStream FIS = NULL;
尝试 {
FIS = openFileInput(contacts.xml);
}赶上(FileNotFoundException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
尝试 {
XmlPullParserFactory厂;
工厂= XmlPullParserFactory.newInstance();
factory.setNamespaceAware(真正的);
XmlPullParser解析器= factory.newPullParser();
parser.setInput(新的InputStreamReader(FIS));
INT EVENTTYPE = parser.getEventType();
INT O = 0;
而(EVENTTYPE!= XmlPullParser.END_DOCUMENT){
HashMap的<字符串,字符串>图=新的HashMap<字符串,字符串>();
//设置标志主要标签。
如果(EVENTTYPE == XmlPullParser.START_DOCUMENT){
}否则,如果(EVENTTYPE == XmlPullParser.START_TAG){
串TAG_NAME = parser.getName();
如果(tag_name.contains(接触)){
// Log.i(标签,
// 名称
// +将String.valueOf(分析器
// .getAttributeValue(0))
// +......................
// +号
// +将String.valueOf(分析器
// .getAttributeValue(1)));
NAME =将String.valueOf(parser.getAttributeValue(0));
phoneNumber的=将String.valueOf(分析器
.getAttributeValue(1));
Log.i(姓名,phoneNumber的);
map.put(名称,姓名);
map.put(电话,phoneNumber的);
list.add(图)
算上++;
}
}
尝试 {
EVENTTYPE = parser.next();
}赶上(IOException异常E){
// TODO自动生成的catch块
e.printStackTrace();
}
}
Log.i(最终文件,端+计);
}赶上(XmlPullParserException E){
// TODO自动生成的catch块
e.printStackTrace();
}
返回列表;
}
}
试试这个办法,希望这将帮助你解决你的问题。
公共类Contactselect延伸活动{
私人的ListView LV;
私人的EditText等;
私人键b;
私人诠释计数;
私人字符串名称=联系;
私人字符串电话=PHONENUMBER;
私人字符串IsSelected =isSelected;
私人的ArrayList< HashMap的<字符串,字符串>>名单=新的ArrayList< HashMap的<字符串,字符串>>();
私人ContactAdapter适配器;
@覆盖
公共无效的onCreate(包savedInstanceState){
super.onCreate(savedInstanceState);
的setContentView(R.layout.activity_main);
LV =(ListView控件)findViewById(R.id.contactlist);
lv.setTextFilterEnabled(真正的);
等=(EditText上)findViewById(R.id.search);
B =(按钮)findViewById(R.id.done);
listcontacts();
适配器=新ContactAdapter(这一点,清单);
lv.setAdapter(适配器);
b.setOnClickListener(新Button.OnClickListener(){
@覆盖
公共无效的onClick(视图v){
字符串选择=;
对(HashMap的<字符串,字符串>行:名单){
如果(row.get(IsSelected).equals(真)){
选择+ = row.get(名称)+\ N的;
}
}
Toast.makeText(Contactselect.this,选择,Toast.LENGTH_LONG)
。显示();
}
});
et.addTextChangedListener(新TextWatcher(){
@覆盖
公共无效onTextChanged(CharSequence的CS,诠释ARG1,诠释ARG2,诠释ARG3){
adapter.filter(cs.toString());
}
@覆盖
公共无效beforeTextChanged(CharSequence的arg0中,诠释ARG1,诠释ARG2,诠释ARG3){
}
@覆盖
公共无效afterTextChanged(编辑为arg0){
}
});
}
私人无效listcontacts(){
的FileInputStream FIS = NULL;
尝试 {
FIS = openFileInput(contacts.xml);
}赶上(FileNotFoundException异常E){
e.printStackTrace();
}
尝试 {
XmlPullParserFactory厂;
工厂= XmlPullParserFactory.newInstance();
factory.setNamespaceAware(真正的);
XmlPullParser解析器= factory.newPullParser();
parser.setInput(新的InputStreamReader(FIS));
INT EVENTTYPE = parser.getEventType();
INT O = 0;
而(EVENTTYPE!= XmlPullParser.END_DOCUMENT){
HashMap的<字符串,字符串>图=新的HashMap<字符串,字符串>();
//设置标志主要标签。
如果(EVENTTYPE == XmlPullParser.START_DOCUMENT){
}否则,如果(EVENTTYPE == XmlPullParser.START_TAG){
串TAG_NAME = parser.getName();
如果(tag_name.contains(接触)){
// Log.i(标签,
// 名称
// +将String.valueOf(分析器
// .getAttributeValue(0))
// +......................
// +号
// +将String.valueOf(分析器
// .getAttributeValue(1)));
Log.i(姓名,phoneNumber的);
map.put(名称,将String.valueOf(parser.getAttributeValue(0)));
map.put(电话,将String.valueOf(分析器
.getAttributeValue(1)));
map.put(IsSelected,假);
list.add(图)
算上++;
}
}
尝试 {
EVENTTYPE = parser.next();
}赶上(IOException异常E){
e.printStackTrace();
}
}
Log.i(最终文件,端+计);
}赶上(XmlPullParserException E){
e.printStackTrace();
}
}
类ContactAdapter扩展了BaseAdapter {
私人上下文的背景下;
私人的ArrayList< HashMap的<字符串,字符串>>联系人;
公共ContactAdapter(上下文的背景下,ArrayList的< HashMap的<字符串,字符串>>联系人){
this.context =背景;
this.contacts =新的ArrayList< HashMap的<字符串,字符串>>();
this.contacts.addAll(联系人);
}
@覆盖
公众诠释getCount将(){
返回contacts.size();
}
@覆盖
公共对象的getItem(INT位置){
返回contacts.get(位置);
}
@覆盖
众长getItemId(INT位置){
返回的位置;
}
@覆盖
公共查看getView(最终诠释的立场,观点convertView,ViewGroup中父){
最后ViewHolder持有人;
如果(convertView == NULL){
持有人=新ViewHolder();
convertView = LayoutInflater.from(上下文).inflate(R.layout.row,NULL);
holder.name =(TextView中)convertView.findViewById(R.id.name);
holder.numbers =(TextView中)convertView.findViewById(R.id.numbers);
holder.checkbox =(复选框)convertView.findViewById(R.id.checkbox);
convertView.setTag(保持器);
} 其他 {
支架=(ViewHolder)convertView.getTag();
}
holder.name.setText(contacts.get(位置)获得(名称));
holder.numbers.setText(contacts.get(位置)获得(电话));
holder.checkbox.setOnCheckedChangeListener(新CompoundButton.OnCheckedChangeListener(){
@覆盖
公共无效onCheckedChanged(CompoundButton ButtonView,布尔器isChecked){
contacts.get(位置)。把(IsSelected,+器isChecked);
对(HashMap的<字符串,字符串>数据:名单){
如果(data.get(名称).equals(contacts.get(位置)获得(名称))){
data.put(IsSelected,contacts.get(位置)获得(IsSelected));
打破;
}
}
notifyDataSetChanged();
}
});
如果(contacts.get(位置)获得(IsSelected)的ToString()。等于(假)){
holder.checkbox.setChecked(假);
} 其他 {
holder.checkbox.setChecked(真正的);
}
返回convertView;
}
公共无效过滤器(字符串charText){
contacts.clear();
如果(charText.length()== 0){
contacts.addAll(名单);
} 其他 {
对(HashMap的<字符串,字符串>联系人:名单){
如果(contact.get(名称).toLowerCase()。包括(charText.toLowerCase())){
contacts.add(接触);
}
}
}
notifyDataSetChanged();
}
类ViewHolder {
TextView的名称;
TextView的数量;
复选框复选框;
}
}
}
I am trying to write a program to select multiple items in the listview i populate. but I am having difficulty of selecting multiple items. Please let me know how to do it. Bellow is how i have populate the Arraylist and i have a custom row with checkbox. i need to get the selected items (name, number) on the button click event. Thank you in advance. I have tried to understand the other posts, but since i was unable to relate them to my code, i am not sure of how to do.
public class Contactselect extends Activity {
ListView lv;
EditText et;
int count;
ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
String phoneNumber;
String name;
String Name = "Contact";
String Phone = "Phonenumber";
TextWatcher search;
SimpleAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.contacts);
listcontacts();
lv = (ListView) findViewById(R.id.contactlist);
lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE);
lv.setTextFilterEnabled(true);
adapter = new SimpleAdapter(this, list, R.layout.row, new String[] {
Name, Phone }, new int[] { R.id.names, R.id.numbers });
lv.setAdapter(adapter);
Button b = (Button) findViewById(R.id.done);
b.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
String selected = "";
int cntChoice = lv.getCount();
SparseBooleanArray sparseBooleanArray = lv
.getCheckedItemPositions();
for (int i = 0; i < cntChoice; i++) {
if (sparseBooleanArray.get(i)) {
selected += lv.getItemAtPosition(i).toString() + "\n";
}
}
Toast.makeText(Contactselect.this, selected, Toast.LENGTH_LONG)
.show();
}
});
et = (EditText) findViewById(R.id.search);
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
Contactselect.this.adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,
int arg2, int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});
}
private ArrayList<HashMap<String, String>> listcontacts() {
// TODO Auto-generated method stub
FileInputStream fis = null;
try {
fis = openFileInput("contacts.xml");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
XmlPullParserFactory factory;
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(new InputStreamReader(fis));
int eventType = parser.getEventType();
int o = 0;
while (eventType != XmlPullParser.END_DOCUMENT) {
HashMap<String, String> map = new HashMap<String, String>();
// set flags for main tags.
if (eventType == XmlPullParser.START_DOCUMENT) {
} else if (eventType == XmlPullParser.START_TAG) {
String tag_name = parser.getName();
if (tag_name.contains("contacts")) {
// Log.i("tag",
// "name"
// + String.valueOf(parser
// .getAttributeValue(0))
// + "......................"
// + "number"
// + String.valueOf(parser
// .getAttributeValue(1)));
name = String.valueOf(parser.getAttributeValue(0));
phoneNumber = String.valueOf(parser
.getAttributeValue(1));
Log.i(name, phoneNumber);
map.put(Name, name);
map.put(Phone, phoneNumber);
list.add(map);
count++;
}
}
try {
eventType = parser.next();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Log.i("End document", "Ended" + count);
} catch (XmlPullParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return list;
}
}
Try this way,hope this will help you to solve your problem.
public class Contactselect extends Activity {
private ListView lv;
private EditText et;
private Button b;
private int count;
private String Name = "Contact";
private String Phone = "Phonenumber";
private String IsSelected = "isSelected";
private ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
private ContactAdapter adapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
lv = (ListView) findViewById(R.id.contactlist);
lv.setTextFilterEnabled(true);
et = (EditText) findViewById(R.id.search);
b = (Button) findViewById(R.id.done);
listcontacts();
adapter = new ContactAdapter(this,list);
lv.setAdapter(adapter);
b.setOnClickListener(new Button.OnClickListener() {
@Override
public void onClick(View v) {
String selected = "";
for (HashMap<String,String> row : list){
if(row.get(IsSelected).equals("true")){
selected += row.get(Name) + "\n";
}
}
Toast.makeText(Contactselect.this, selected, Toast.LENGTH_LONG)
.show();
}
});
et.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2,int arg3) {
adapter.filter(cs.toString());
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1,int arg2, int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
}
});
}
private void listcontacts() {
FileInputStream fis = null;
try {
fis = openFileInput("contacts.xml");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
try {
XmlPullParserFactory factory;
factory = XmlPullParserFactory.newInstance();
factory.setNamespaceAware(true);
XmlPullParser parser = factory.newPullParser();
parser.setInput(new InputStreamReader(fis));
int eventType = parser.getEventType();
int o = 0;
while (eventType != XmlPullParser.END_DOCUMENT) {
HashMap<String, String> map = new HashMap<String, String>();
// set flags for main tags.
if (eventType == XmlPullParser.START_DOCUMENT) {
} else if (eventType == XmlPullParser.START_TAG) {
String tag_name = parser.getName();
if (tag_name.contains("contacts")) {
// Log.i("tag",
// "name"
// + String.valueOf(parser
// .getAttributeValue(0))
// + "......................"
// + "number"
// + String.valueOf(parser
// .getAttributeValue(1)));
Log.i(name, phoneNumber);
map.put(Name, String.valueOf(parser.getAttributeValue(0)));
map.put(Phone, String.valueOf(parser
.getAttributeValue(1)));
map.put(IsSelected,"false");
list.add(map);
count++;
}
}
try {
eventType = parser.next();
} catch (IOException e) {
e.printStackTrace();
}
}
Log.i("End document", "Ended" + count);
} catch (XmlPullParserException e) {
e.printStackTrace();
}
}
class ContactAdapter extends BaseAdapter {
private Context context;
private ArrayList<HashMap<String,String>> contacts;
public ContactAdapter(Context context,ArrayList<HashMap<String,String>> contacts) {
this.context =context;
this.contacts =new ArrayList<HashMap<String, String>>();
this.contacts.addAll(contacts);
}
@Override
public int getCount() {
return contacts.size();
}
@Override
public Object getItem(int position) {
return contacts.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = LayoutInflater.from(context).inflate(R.layout.row, null);
holder.name = (TextView) convertView.findViewById(R.id.name);
holder.numbers = (TextView) convertView.findViewById(R.id.numbers);
holder.checkbox = (CheckBox) convertView.findViewById(R.id.checkbox);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.name.setText(contacts.get(position).get(Name));
holder.numbers.setText(contacts.get(position).get(Phone));
holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton ButtonView, boolean isChecked) {
contacts.get(position).put(IsSelected, "" + isChecked);
for (HashMap<String,String> data : list){
if(data.get(Name).equals(contacts.get(position).get(Name))){
data.put(IsSelected,contacts.get(position).get(IsSelected));
break;
}
}
notifyDataSetChanged();
}
});
if (contacts.get(position).get(IsSelected).toString().equals("false")) {
holder.checkbox.setChecked(false);
} else {
holder.checkbox.setChecked(true);
}
return convertView;
}
public void filter(String charText) {
contacts.clear();
if (charText.length() == 0) {
contacts.addAll(list);
} else {
for (HashMap<String,String> contact : list) {
if (contact.get(Name).toLowerCase().contains(charText.toLowerCase())) {
contacts.add(contact);
}
}
}
notifyDataSetChanged();
}
class ViewHolder {
TextView name;
TextView number;
CheckBox checkbox;
}
}
}
这篇关于如何选择从ArrayList中填充Android的列表视图多个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!