Android 自定义listview每10项重复一次
我的listview自定义适配器遇到了奇怪的问题 我的适配器每10次记录重复项目的ID 非常感谢您的帮助和/或想法 我的列表活动Android 自定义listview每10项重复一次,android,listview,adapter,Android,Listview,Adapter,我的listview自定义适配器遇到了奇怪的问题 我的适配器每10次记录重复项目的ID 非常感谢您的帮助和/或想法 我的列表活动 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE);
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_backuplist); // Get main display layout
lv = (ListView) findViewById(android.R.id.list);
lists = new ArrayList<BackupListView>();
int j = 50;
for (int i = 0; i < 15; i++)
{
String fileName = ((i % 2) == 0) ? "sample.csv" : "sample.vcf";
String fileExt = ((i % 2) == 0) ? "csv" : "vcf";
lists.add(new BackupListView(fileName + "\ndate 2014/05/20", j, fileExt, "210"));
j++;
}
int x = lists.size();
BackupListView[] toArray = new BackupListView[x];
toArray = lists.toArray(toArray);
adapter = new BackupListAdapter(this, R.layout.custom_backup_listview_rows, toArray);
lv.setAdapter(adapter);
lv.setClickable(true);
lv.setOnItemClickListener(new OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id)
{
dspDialog();
}
});
}
初始化数组:
Map<Integer,boolean> checkBoxMap = new Map<Integer,boolean>();
剩余的所有侦听器和setText都应该在上述代码之后
final BackupListView lists = data[position];
holder.tw.setText(lists.getText() + " " + lists.getFileSize() + "kb");
holder.id = lists.getId();
Log.i("TEST ", "List getId " + lists.getId());
// Check box event
holder.cb.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (((CompoundButton) v).isChecked())
{
checkedItem.add("" + lists.getId());
}
else
{
checkedItem.remove("" + lists.getId());
}
}
});
// Set CSV file extension icon
if(lists.getExt().equals("csv"))
holder.im.setBackgroundResource(R.drawable.icon_csv);
else
holder.im.setBackgroundResource(R.drawable.icon_vcf);
// Button event
holder.bt.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
final View inflater;
inflater = ((Activity) context).getLayoutInflater().inflate(
R.layout.dialog_filename_change, null);
AlertDialog.Builder dialog = new AlertDialog.Builder(
context.getApplicationContext());
dialog.setTitle("Enter Pass");
dialog.setView(inflater);
dialog.setInverseBackgroundForced(true);
dialog.setNegativeButton("Cancel", null);
dialog.setPositiveButton("OK", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Intent i = new Intent(context.getApplicationContext(),
PhoneBookDetail.class);
i.putExtra("id", lists.getId());
context.startActivity(i);
}
});
dialog.create();
Log.i("TEST", " Clicked " + lists.getId());
//dialog.show();
}
});
我的意思是所有下面的cose都应该遵循上面的代码
final BackupListView lists = data[position];
holder.tw.setText(lists.getText() + " " + lists.getFileSize() + "kb");
holder.id = lists.getId();
Log.i("TEST ", "List getId " + lists.getId());
// Check box event
holder.cb.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (((CompoundButton) v).isChecked())
{
checkedItem.add("" + lists.getId());
}
else
{
checkedItem.remove("" + lists.getId());
}
}
});
// Set CSV file extension icon
if(lists.getExt().equals("csv"))
holder.im.setBackgroundResource(R.drawable.icon_csv);
else
holder.im.setBackgroundResource(R.drawable.icon_vcf);
// Button event
holder.bt.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
final View inflater;
inflater = ((Activity) context).getLayoutInflater().inflate(
R.layout.dialog_filename_change, null);
AlertDialog.Builder dialog = new AlertDialog.Builder(
context.getApplicationContext());
dialog.setTitle("Enter Pass");
dialog.setView(inflater);
dialog.setInverseBackgroundForced(true);
dialog.setNegativeButton("Cancel", null);
dialog.setPositiveButton("OK", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Intent i = new Intent(context.getApplicationContext(),
PhoneBookDetail.class);
i.putExtra("id", lists.getId());
context.startActivity(i);
}
});
dialog.create();
Log.i("TEST", " Clicked " + lists.getId());
//dialog.show();
}
});
lists变量是最终变量,用于指向特定位置的单击中。当视图被回收时。列表保持不变,因此可以获得重复项。请参见,您需要将更改保存在一个区域中,并更改从Thayener selam读取的项目(如列表),她在《凯塔·比尔米格斯特梅克》中饰演的亚尼在《凯蒂·尤克尔·尤尔松·索拉》中饰演的儿子凯蒂·塔格伦斯·耶尼在《凯蒂·米克·尤尔梅耶·阿尔》中饰演的角色让人耳目一新yorsun@ErsinG尤尔巴哈英语。这是英语问答site@Raghunandan当然,我会的。更有趣的是,我对电话列表使用了相同的适配器,但效果非常好。无论如何,我总是在我的每一个项目中使用列表适配器,但这是我第一次遇到这样的错误@谢谢你的链接。我刚刚读了它,但我不能为我的listview确定宽度和高度。谢谢回复。我已经做了,但不知怎么的,它不起作用。另一个问题是,当我单击列表中#1项处的复选框并快速从上到下从下到上滚动列表,然后在列表视图中选中#1处的复选标记“移动到随机项”。非常非常奇怪的情况。维护一个数组,如ArrayList arrayBool=new ArrayList();在checkBox onClick方法中,保持类似arrayBool[position]=checkBox.isChecked();在getView方法中,keep like checkBox.setChecked(arrayBool[position]);这将解决您的问题。用Map更改了我的答案。请检查此解决方案。我很抱歉,我不能处理这种情况,我想我需要更多的实际例子和更多的展示案例。
if (convertView == null)
{
LayoutInflater inflate = ((Activity) context).getLayoutInflater();
convertView = inflate.inflate(resID, null);
holder = new CustomHolder();
holder.cb = (CheckBox) convertView.findViewById(R.id.custom_checkbox);
holder.im = (ImageView) convertView.findViewById(R.id.img_file_ext_icon);
holder.tw = (TextView) convertView.findViewById(R.id.custom_textView);
holder.bt = (ImageView) convertView.findViewById(R.id.custom_button); convertView.setTag(holder);
} else {
holder = (CustomHolder) convertView.getTag();
}
// Check box event
holder.cb.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
checkBoxMap.put(position,((CompoundButton) v).isChecked())
}
});
holder.cb.setChecked(checkBoxMap.get(position));
final BackupListView lists = data[position];
holder.tw.setText(lists.getText() + " " + lists.getFileSize() + "kb");
holder.id = lists.getId();
Log.i("TEST ", "List getId " + lists.getId());
// Check box event
holder.cb.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if (((CompoundButton) v).isChecked())
{
checkedItem.add("" + lists.getId());
}
else
{
checkedItem.remove("" + lists.getId());
}
}
});
// Set CSV file extension icon
if(lists.getExt().equals("csv"))
holder.im.setBackgroundResource(R.drawable.icon_csv);
else
holder.im.setBackgroundResource(R.drawable.icon_vcf);
// Button event
holder.bt.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
final View inflater;
inflater = ((Activity) context).getLayoutInflater().inflate(
R.layout.dialog_filename_change, null);
AlertDialog.Builder dialog = new AlertDialog.Builder(
context.getApplicationContext());
dialog.setTitle("Enter Pass");
dialog.setView(inflater);
dialog.setInverseBackgroundForced(true);
dialog.setNegativeButton("Cancel", null);
dialog.setPositiveButton("OK", new OnClickListener()
{
@Override
public void onClick(DialogInterface dialog, int which)
{
Intent i = new Intent(context.getApplicationContext(),
PhoneBookDetail.class);
i.putExtra("id", lists.getId());
context.startActivity(i);
}
});
dialog.create();
Log.i("TEST", " Clicked " + lists.getId());
//dialog.show();
}
});