为什么我会在我的listview中获得重复项目?
我检查了数组menuItems,它似乎很好,但在下面的代码中有错误。 当我开始它看起来还好,但是当我开始滚动它被搞砸了,并把项目的列表和重复项的顶部....这为什么我会在我的listview中获得重复项目?
public class ScoresAdapter extends BaseAdapter {
private MainActivity activity;
private ScoreItem[] menuItems;
private static LayoutInflater inflater=null;
ImageDownloader downloader;
public ScoresAdapter(MainActivity a, ScoreItem[] scoreItems) {
activity = a;
menuItems = scoreItems;
inflater = (LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
downloader = new ImageDownloader();
}
public int getCount() {
int teller = 0;
for(int i = 0 ; menuItems.length > i ; i++){
if(menuItems[i] != null){
teller++;
}
}
return teller;
}
public Object getItem(int position) {
return position;
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null){
if(menuItems[position].getId() == 888){
//fav header
vi = inflater.inflate(R.layout.scoresheaderfavoriet, null);
}else if(menuItems[position].getId() == 999){
//overige header
vi = inflater.inflate(R.layout.scoresheaderoverig, null);
}else{
if(menuItems[position].getIsFav()){
vi = inflater.inflate(R.layout.scoresfavitem, null);
}else{
vi = inflater.inflate(R.layout.scoresitem, null);
}
TextView text2=(TextView)vi.findViewById(R.id.position);
text2.setText(""+ menuItems[position].getPosition());
TextView text=(TextView)vi.findViewById(R.id.name);
text.setText(menuItems[position].getFirstName() + " " + menuItems[position].getLastName().toUpperCase());
TextView text5=(TextView)vi.findViewById(R.id.country);
text5.setText(""+ menuItems[position].getCountry());
TextView text3=(TextView)vi.findViewById(R.id.score);
text3.setText(""+ menuItems[position].getScore());
TextView text8=(TextView)vi.findViewById(R.id.hole);
text8.setText(""+ menuItems[position].getHole());
vi.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), SpelerView.class);
intent.putExtra("id", menuItems[position].getId());
v.getContext().startActivity(intent);
activity.sluitAlleMenus();
}
});
}
}
return vi;
}
}
我有同样的问题曾经只是怪异。我想这是因为适配器的“缓存”的...你应该实现一个else这样的:
if(convertView==null){
holder = new NodeViewHolder();
//Your stuff
convertView.setTag(holder);
}else{
holder = (NodeViewHolder) convertView.getTag();
}
public static class NodeViewHolder {
TextView text;
TextView text2;
TextView text3;
//So on...
}
当查看缓存(NOT NULL)它会被执行
你是不是处理你的情况,当你的convertView不正确为空。改变你的代码是这样的:
public View getView(final int position, View convertView, ViewGroup parent) {
View vi=convertView;
if(convertView==null){
if(menuItems[position].getId() == 888){
//fav header
vi = inflater.inflate(R.layout.scoresheaderfavoriet, null);
}else if(menuItems[position].getId() == 999){
//overige header
vi = inflater.inflate(R.layout.scoresheaderoverig, null);
}else{
if(menuItems[position].getIsFav()){
vi = inflater.inflate(R.layout.scoresfavitem, null);
}else{
vi = inflater.inflate(R.layout.scoresitem, null);
}
}
}
TextView text2=(TextView)vi.findViewById(R.id.position);
text2.setText(""+ menuItems[position].getPosition());
TextView text=(TextView)vi.findViewById(R.id.name);
text.setText(menuItems[position].getFirstName() + " " + menuItems[position].getLastName().toUpperCase());
TextView text5=(TextView)vi.findViewById(R.id.country);
text5.setText(""+ menuItems[position].getCountry());
TextView text3=(TextView)vi.findViewById(R.id.score);
text3.setText(""+ menuItems[position].getScore());
TextView text8=(TextView)vi.findViewById(R.id.hole);
text8.setText(""+ menuItems[position].getHole());
vi.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
Intent intent = new Intent(v.getContext(), SpelerView.class);
intent.putExtra("id", menuItems[position].getId());
v.getContext().startActivity(intent);
activity.sluitAlleMenus();
}
});
return vi;
}
这会让你最有方法。您可能必须将您的收藏夹和/或页眉页脚逻辑移出if(convertView ==null)
。虽然我不能完全说出你在做什么,所以我不知道它应该如何。
我有同样的问题
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
CalendarsData c = (CalendarsData) this.getItem(position);
if (convertView == null) {
holder=new ViewHolder();
convertView = l_Inflater.inflate(R.layout.preference_list_element, null);
holder.text=(CheckBox)convertView.findViewById(R.id.checkTextView);
//holder.tv =(TextView)convertView.findViewById(R.id.textview);
holder.text.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
CheckBox cb = (CheckBox) v;
CalendarsData ssi = (CalendarsData) cb.getTag();
ssi.setChecked(cb.isChecked());
}
});
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText("c.anyvalue");
return convertView;
}
像上面的家伙说,你需要的东西:
} else {
holder = (ViewHolder) convertView.getTag();
如果你有解决然后发布我有同样的问题。 – PankajAndroid 2013-10-18 12:06:16
@PankajAndroid还需要帮助吗? – oxbox 2014-03-16 19:15:40
@oxboy不,谢谢我解决了它 – PankajAndroid 2014-03-18 04:25:36
如果convertView不是null你什么都不做吧,但你应该。 convertView - 是不在屏幕上的回收物品。您已经将数据传递给它。所以,你应该改变这些数据。 – bluebyte 2012-07-19 15:42:17
@Jay Biggue如果你已经解决然后发布我有同样的问题 – PankajAndroid 2013-10-18 12:04:32