我有自定义listview
public class MisscallListAdapter extends ArrayAdapter<SmsClass>
这是viewHolder
:
private static class ViewHolder {
TextView number , name , date , count , time;
ImageButton btnCall , btnSendsms , btnDelete;
ImageView imageIcon;
CheckBox checkBox;
}
在getView
方法中,我尝试获取用户单击的项目并将其放在ArrayList
中,如下所示:
public View getView(final int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
final SmsClass smsClass = getItem(position);
String nameInside = smsClass.getName();
final String numInside = smsClass.getNumberInside();
LayoutInflater mInflater = (LayoutInflater) context
.getSystemService( Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.single_list, null);
viewHolder = new ViewHolder();
viewHolder.number = (TextView) convertView.findViewById(R.id.number);
viewHolder.date =(TextView) convertView.findViewById(R.id.date);
viewHolder.name = (TextView)convertView.findViewById(R.id.name);
viewHolder.count = (TextView)convertView.findViewById(R.id.count);
viewHolder.btnCall = (ImageButton) convertView.findViewById( R.id.btn_call );
viewHolder.btnSendsms = (ImageButton)convertView.findViewById( R.id.btn_sms);
viewHolder.imageIcon = (ImageView) convertView.findViewById(R.id.icon);
viewHolder.checkBox = (CheckBox) convertView.findViewById( R.id.checkBox);
convertView.setTag(viewHolder);
} else
viewHolder = (ViewHolder) convertView.getTag();
viewHolder.name.setText( //text );
viewHolder.date.setText( //text );
viewHolder.number.setText( //text );
viewHolder.count.setText( //text );
viewHolder.btnSendsms.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
TextView selected = (TextView) MainActivity.smsList.getChildAt(position).findViewById(R.id.name);
clicked_number = selected.getText().toString();
openSMS( numInside);
}
catch (Exception e){}
}
} );
viewHolder.btnCall.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
try{
TextView selected = (TextView) MainActivity.smsList.getChildAt(position).findViewById(R.id.name);
clicked_number = selected.getText().toString();
dialContactPhone(numInside);
}
catch (Exception e){}
}
} );
final ViewHolder finalViewHolder = viewHolder;
final View finalConvertView = convertView;
viewHolder.checkBox.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
if (finalViewHolder.checkBox.isChecked()) {
selected.add( smsClass );
} else {
for(int i = 0 ; i < selected.size() ; i++){
if(selected.get( i ).getId() == smsClass.getId())
selected.remove( i );
}
}
}
} );
if(isEnd == true) {
for (int i = 0; i < MainActivity.smsList.getCount(); i++) {
Log.i( "ujkac" , "count: " + i );
viewHolder.checkBox.setChecked( false );
}
}
return convertView;
}
上面的smsClass
是:
final SmsClass smsClass = getItem(position);
问题是当我选择列表的第一行(仅是第一项)并选中它时,也选中了第五项,第十项又选中了... 请帮助。
答案 0 :(得分:0)
您必须使用Viewholder Pattern!参见RecyclerView with ViewHolder pattern 这是简单有效的方法!
答案 1 :(得分:0)
在重新创建视图的布局时(如果存在),您将还原以下值:
viewHolder.name.setText( //text );
viewHolder.date.setText( //text );
viewHolder.number.setText( //text );
viewHolder.count.setText( //text );
但是您没有恢复checkbox
的状态。缺少该行:
viewHolder.checkbox.setChecked(checkedArray[position];
那是为了恢复。
代码中还缺少一部分,您可以根据视图的位置保存复选框状态(我假设您的列表是静态的)。
viewHolder.checkBox.setOnClickListener( new View.OnClickListener() {
@Override
public void onClick(View v) {
//...
checkedArray[position] = !checkBox.isChecked();
//...
}
});
我想指出一件事。如果要收听复选框的状态,则应使用setOnCheckedChangeListener。