точная позиция, не полученная при случайном выборе флажка в listview, показывает indexoutofboundsexception
У меня есть listview с textview и checkbox, который заполняется из arraylist, получающего данные из web service.It работает отлично.Теперь, когда я отмечаю определенную позицию флажка в списке, она выбирается, если я проверяю линейно сверху вниз.однако, если я произвольно отмечаю любой флажок в списке, точное положение флажка не выбирается, и он показывает indexoutofbounds исключение.Я пробовал как адаптер массива, так и базовый адаптер.пожалуйста помочь мне.
Базовый Адаптер
public NewsAdapter(Context context, List<FtpTable> ftpTables) {
//Common.selectedFtpTable=null;
this.mContext= context;
this.ftpTables = ftpTables;
inflater = LayoutInflater.from(mContext);
}
public class ViewHolder {
TextView name_agency;
CheckBox cb_agency;
//TextView ime;
//TextView telefon1;
//TextView telefon2;
}
@Override
public int getCount() {
return ftpTables.size();
}
@Override
public FtpTable getItem(int position) {
return ftpTables.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
public View getView(final int position, View view, ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(R.layout.news_agencies_row, parent, false);
holder.name_agency = (TextView) view.findViewById(R.id.name_agency);
holder.cb_agency=(CheckBox)view.findViewById(R.id.chk_agency);
view.setTag(holder);
holder.cb_agency.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (holder.cb_agency.isChecked()) {
Toast.makeText(mContext,"You have selected:"+ftpTables.get(position).getNewsAgency("newsAgency"),Toast.LENGTH_SHORT).show();
Common.selectedNewsAgencyArray.add(ftpTables.get(position).getNewsAgency("newsAgency"));
//Common.selectedFtpTable.add(ftpTables.get(position));
//Toast.makeText(mContext,Common.selectedFtpTable.size(),Toast.LENGTH_SHORT).show();
Common.selectedHostArray.add(ftpTables.get(position).getHostFtp("hostFtp"));
Toast.makeText(mContext,"SIZE OF HOST ARRAY:"+Common.selectedHostArray.size(),Toast.LENGTH_SHORT).show();
// Toast.makeText(mContext,"You have added:"+Common.selectedHostArray.get(position),Toast.LENGTH_SHORT).show();
Common.selectedUsernameArray.add(ftpTables.get(position).getUsernameFtp("usernameFtp"));
Toast.makeText(mContext,"SIZE OF USERNAME ARRAY:"+Common.selectedUsernameArray.size(),Toast.LENGTH_SHORT).show();
//Toast.makeText(mContext,"You have added:"+Common.selectedUsernameArray.get(position),Toast.LENGTH_SHORT).show();
Common.selectedPasswordArray.add(ftpTables.get(position).getPasswordFtp("passwordFtp"));
Toast.makeText(mContext,"SIZE OF PASSWORD ARRAY:"+Common.selectedPasswordArray.size(),Toast.LENGTH_SHORT).show();
Toast.makeText(mContext,"You have added:"+Common.selectedHostArray.get(position)+","+Common.selectedUsernameArray.get(position)+","+Common.selectedPasswordArray.get(position),Toast.LENGTH_SHORT).show();
}
else {
Toast.makeText(mContext,"You have unselected",Toast.LENGTH_SHORT).show();
/*indexToRemove = Common.selectedHostArray.indexOf(ftpTables.get(position).getHostFtp("hostFtp"));
Common.selectedHostArray.remove(indexToRemove);
Common.selectedNewsAgencyArray.remove(indexToRemove);
Common.selectedUsernameArray.remove(indexToRemove);
Common.selectedPasswordArray.remove(indexToRemove);
Toast.makeText(mContext,"SIZE OF HOST ARRAY:"+Common.selectedHostArray.size(),Toast.LENGTH_SHORT).show();
Toast.makeText(mContext,"SIZE OF USERNAME ARRAY:"+Common.selectedUsernameArray.size(),Toast.LENGTH_SHORT).show();
Toast.makeText(mContext,"SIZE OF PASSWORD ARRAY:"+Common.selectedPasswordArray.size(),Toast.LENGTH_SHORT).show();
Toast.makeText(mContext,"You have removed:"+Common.selectedHostArray.get(indexToRemove)+","+Common.selectedUsernameArray.get(indexToRemove)+","+Common.selectedPasswordArray.get(indexToRemove),Toast.LENGTH_SHORT).show();*/
}
}
});
} else {
holder = (ViewHolder) view.getTag();
}
holder.name_agency.setText(ftpTables.get(position).getNewsAgency("newsAgency"));
//holder.telefon1.setText(taxiLists.get(position).getTelefon1("telefon1"));
//holder.telefon2.setText(taxiLists.get(position).getTelefon2("telefon2"));
return view;
}
Адаптер Массива
public class AgencyListAdapter extends ArrayAdapter<FtpTable> {
public List<FtpTable> ftpTables = null;
int indexToRemove=-1;
Context mContext;
int CheckValue;
public AgencyListAdapter(Context context, ArrayList<FtpTable> tables,int CheckValue) {
super(context, 0, tables);
this.mContext= context;
this.ftpTables = tables;
this.CheckValue=CheckValue;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// Get the data item for this position
//Common.position=position;
FtpTable ftpTable = getItem(position);
//convertView.setTag(ftpTable);
// Check if an existing view is being reused, otherwise inflate the view
//if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.news_agencies_row, parent, false);
final TextView name_agency = (TextView) convertView.findViewById(R.id.name_agency);
final CheckBox cb_agency = (CheckBox) convertView.findViewById(R.id.chk_agency);
convertView.setTag(ftpTable);
cb_agency.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean b) {
if (cb_agency.isChecked()) {
/*if (CheckValue == 0) {
CheckValue = 1;
Toast.makeText(mContext,String.valueOf(CheckValue),Toast.LENGTH_SHORT).show();*/
//cb_agency.setChecked(true);
Toast.makeText(mContext, "You have selected:" + ftpTables.get(position).getNewsAgency("newsAgency"), Toast.LENGTH_SHORT).show();
Common.selectedNewsAgencyArray.add(ftpTables.get(position).getNewsAgency("newsAgency"));
//Common.selectedFtpTable.add(ftpTables.get(position));
//Toast.makeText(mContext,Common.selectedFtpTable.size(),Toast.LENGTH_SHORT).show();
Common.selectedHostArray.add(ftpTables.get(position).getHostFtp("hostFtp"));
Toast.makeText(mContext, "SIZE OF HOST ARRAY:" + Common.selectedHostArray.size(), Toast.LENGTH_SHORT).show();
// Toast.makeText(mContext,"You have added:"+Common.selectedHostArray.get(position),Toast.LENGTH_SHORT).show();
Common.selectedUsernameArray.add(ftpTables.get(position).getUsernameFtp("usernameFtp"));
Toast.makeText(mContext, "SIZE OF USERNAME ARRAY:" + Common.selectedUsernameArray.size(), Toast.LENGTH_SHORT).show();
//Toast.makeText(mContext,"You have added:"+Common.selectedUsernameArray.get(position),Toast.LENGTH_SHORT).show();
Common.selectedPasswordArray.add(ftpTables.get(position).getPasswordFtp("passwordFtp"));
Toast.makeText(mContext, "SIZE OF PASSWORD ARRAY:" + Common.selectedPasswordArray.size(), Toast.LENGTH_SHORT).show();
Toast.makeText(mContext, "You have added:" + Common.selectedHostArray.get(position) + "," + Common.selectedUsernameArray.get(position) + "," + Common.selectedPasswordArray.get(position), Toast.LENGTH_SHORT).show();
//CheckValue=0;
} else {
//cb_agency.setChecked(false);
//Toast.makeText(mContext, String.valueOf(CheckValue), Toast.LENGTH_SHORT).show();
Toast.makeText(mContext, "You have unselected", Toast.LENGTH_SHORT).show();
//Toast.makeText(mContext,CheckValue,Toast.LENGTH_SHORT).show();
/*indexToRemove = Common.selectedHostArray.indexOf(ftpTables.get(position).getHostFtp("hostFtp"));
Common.selectedHostArray.remove(indexToRemove);
Common.selectedNewsAgencyArray.remove(indexToRemove);
Common.selectedUsernameArray.remove(indexToRemove);
Common.selectedPasswordArray.remove(indexToRemove);
Toast.makeText(mContext,"SIZE OF HOST ARRAY:"+Common.selectedHostArray.size(),Toast.LENGTH_SHORT).show();
Toast.makeText(mContext,"SIZE OF USERNAME ARRAY:"+Common.selectedUsernameArray.size(),Toast.LENGTH_SHORT).show();
Toast.makeText(mContext,"SIZE OF PASSWORD ARRAY:"+Common.selectedPasswordArray.size(),Toast.LENGTH_SHORT).show();
Toast.makeText(mContext,"You have removed:"+Common.selectedHostArray.get(indexToRemove)+","+Common.selectedUsernameArray.get(indexToRemove)+","+Common.selectedPasswordArray.get(indexToRemove),Toast.LENGTH_SHORT).show();*/
}
}
});
name_agency.setText(ftpTables.get(position).getNewsAgency("newsAgency"));
//holder.telefon1.setText(taxiLists.get(position).getTelefon1("telefon1"));
//holder.telefon2.setText(taxiLists.get(position).getTelefon2("telefon2"));
// Lookup view for data population
//TextView tvName = (TextView) convertView.findViewById(R.id.tvName);
//TextView tvHome = (TextView) convertView.findViewById(R.id.tvHome);
// Populate the data into the template view using the data object
//tvName.setText(user.name);
//tvHome.setText(user.hometown);
// Return the completed view to render on screen
return convertView;
}
}
}
1 ответ:
Не делайте переменную position окончательной, получите объект FtpTable с помощью тега
cb_agency.setTag(ftpTable);
, а затем извлеките объект вsetOnCheckedChangeListener
с помощьюcompoundButton.getTag()
.cb_agency.setTag(ftpTable); cb_agency.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton compoundButton, boolean b) { FtpTable ftp = (FtpTable) compoundButton.getTag(); //now you don't need position variable here. Toast.makeText(mContext, "You have selected:" + ftp.getNewsAgency("newsAgency"), Toast.LENGTH_SHORT).show(); } }