2

配列 menuItems を確認しましたが、問題ないように見えますが、次のコードに問題があります。開始すると問題ないように見えますが、スクロールを開始すると、めちゃくちゃになり、アイテムがリストの一番上に置かれ、アイテムが複製されます....それはただ変です

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;
}
}
4

3 に答える 3

2

私は同じ問題を抱えていました

    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が必要だと言います:

} else {
        holder = (ViewHolder) convertView.getTag();
于 2013-03-07T14:39:44.997 に答える
0

convertView が正しく null ではないケースを処理していません。コードを次のように変更します。

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)。ただし、あなたがそれで何をしているのか正確にはわかりません。そのため、どのようにする必要があるかはわかりません。

于 2012-07-19T15:47:00.083 に答える
0

私はかつて同じ問題を抱えていました。アダプターの「キャッシュ」が原因だと思います...次のような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...
 }

ビューがキャッシュされたときに実行されます (null ではありません)。

于 2012-07-19T15:43:12.657 に答える