0

ユーザー数などの入力を取り、リストビューに関していくつかの修正名、電話などを入力するアプリケーションがあります。すべてのリストビューを最適化するためにビューホルダーを使用しました。ユーザーデータをロードするリストビューを除いて、すべてのリストビューは正常に機能します。

ここに画像の説明を入力

画像から、最初と最後の行がロードされていることがわかりますが、中央の 2 つの行はロードされておらず、ロードに多くの時間がかかります。すべての行に入力する情報は最初は同じで、ユーザーが変更できるように残されています。これが私がそのために使用するコードです。

public View getView(final int position, View convertView,final ViewGroup parent)
{
    View rowview = convertView;
    if(rowview == null)
    {
        ViewHolder viewholder = new ViewHolder();
        final LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowview = inflater.inflate(R.layout.list_skeleton_people_expenses, parent, false);
        viewholder.tv1 = (TextView)rowview.findViewById(R.id.name);
        viewholder.tv2 = (TextView)rowview.findViewById(R.id.destination);
        viewholder.tv3 = (TextView)rowview.findViewById(R.id.start);
        viewholder.tv4 = (TextView)rowview.findViewById(R.id.phno);
        viewholder.rowview = rowview;
        rowview.setTag(viewholder);
    }
    else
    {   
        ViewHolder holder = (ViewHolder) rowview.getTag();
        UserData temp = objects.get(position);
        holder.tv1.setText(temp.name);

        holder.tv2.setText("Destination: "+temp.loc);

        holder.tv3.setText("Start: "+start);

        String phone_txt = objects.get(position).phno;
        phone_txt = "("+phone_txt.substring(0, 3)+") "+phone_txt.substring(3, 6)+"-"+phone_txt.substring(6, 10);

        holder.tv4.setText(phone_txt);
    }
    return rowview;
}

static class ViewHolder
{
    TextView tv1,tv2,tv3,tv4;
    View rowview;
}

前もって感謝します。

4

1 に答える 1

2

if else ステートメントの外側でテキスト ビューを作成する必要があります。真ん中のものは最初のケースに引っかかり、プロパティは満たされていません。

public View getView(final int position, View convertView,final ViewGroup parent)
{
    View rowview = convertView; 
    ViewHolder viewholder;

    if (rowview == null) {
        viewholder = new ViewHolder();
        final LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        rowview = inflater.inflate(R.layout.list_skeleton_people_expenses, parent, false);
        viewholder.tv1 = (TextView)rowview.findViewById(R.id.name);
        viewholder.tv2 = (TextView)rowview.findViewById(R.id.destination);
        viewholder.tv3 = (TextView)rowview.findViewById(R.id.start);
        viewholder.tv4 = (TextView)rowview.findViewById(R.id.phno);
        viewholder.rowview = rowview;
        rowview.setTag(viewholder);     
    } else {
        viewholder = (ViewHolder) convertView.getTag();
    }

    UserData temp = objects.get(position);

    holder.tv1.setText(temp.name);

    holder.tv2.setText("Destination: "+temp.loc);

    holder.tv3.setText("Start: "+start);

    String phone_txt = objects.get(position).phno;
    phone_txt = "("+phone_txt.substring(0, 3)+") "+phone_txt.substring(3, 6)+"-"+phone_txt.substring(6, 10);

    holder.tv4.setText(phone_txt);
    return rowview;
}

また、ランダムなアドバイスとして、一連の文字列を「+」演算子と一緒に連結するのは非常に非効率的であるため、代わりに StringBuilder を使用してみてください。「+」を使用するたびに、Java はバックグラウンドで新しい StringBuilder オブジェクトを作成し、文字列を一緒に追加します。文字列は可変ではないためです。そのため、'+' を 4 ~ 5 回使用してガベージ コレクターがクリーンアップしなければならない不要なオブジェクトを強制的に作成する代わりに、StringBuilder を 1 つ作成して、連結する文字列を追加することもできます。

ハッピーコーディング!

于 2013-08-02T20:01:35.553 に答える