0

こんにちは、理解できない非常に奇妙な問題を見つけました.誰かが私を助けてくれることを願っています:

すべてのビューが画面上に配置されている場合、私のリストは見栄えがします。画面が小さくなる (またはリストが長くなる) とすぐに、エントリが本来あるべきビューとは異なるビューになることがあります。この問題は、エントリがウィンドウの外に出るように上下にスクロールすることで制限できます。

異なるレイアウト ファイルを持つ異なるエントリ タイプのリストビューがあります。これは、表示されるレイアウトを決定するメソッドです。

public View getView(int position, View view, ViewGroup parent) {
        NavigationListEntry i = entries.get(position);
        View v = view;
        if (v == null)
            switch(i.Type) {
            case ACTIVE_ENTRY:
                v = inflater.inflate(R.layout.list_nav_row_active, null);
                break;
            case HEADER:
                v = inflater.inflate(R.layout.list_nav_row_header, null);
                break;
            ...
            default:
                v = inflater.inflate(R.layout.list_nav_row_active, null);
                break;
            }
}

なぜこれが発生するのか、何か考えはありますか?

/edit 「if (v == null)」を削除するだけでうまくいくようです

4

3 に答える 3

1

ここで問題が発生します。パラメータで取得したリサイクルは、返したいものViewと同じではない可能性があります。TypevがタイプAであり、nullではないとします。投稿したコードは、それについて何も述べていません。

于 2012-11-28T12:43:31.617 に答える
1

削除するif(v==null)と、すでに膨張しているビューを再利用していません。これを行うと、リスト ビューが少し遅くなります。

最善の方法は

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder = null;
    NavigationListEntry i = getItem(position);
    if(null == convertView){
        convertView = inflateNewView(i.type);
        holder = (ViewHolder) convertView.getTag();
    } else{
        //getting tag to obtain the already found views
        holder = (ViewHolder) convertView.getTag();
        if(holder.type != i.type){
            convertView = inflateNewView(i.type); 
            holder = (ViewHolder) convertView.getTag();
        }
    }

    //always update the elements 
    holder.title.setText(i.getTitle());
    holder.desc.setText(i.getDesc());
    holder.content.setText(i.getContent());

    return convertView;
}

/**
 * Inflates a new view for the specified type
 * @return the newly inflated view
 */
private View inflateNewView(int type){
        View convertView = null;
        switch(type) {
        case ACTIVE_ENTRY:
            convertView = inflater.inflate(R.layout.list_nav_row_active, null);
            break;
        case HEADER:
            convertView = inflater.inflate(R.layout.list_nav_row_header, null);
            break;
        ...
        default:
            convertView = inflater.inflate(R.layout.list_nav_row_active, null);
            break;
        }
        holder = new ViewHolder();
        convertView = inflater.inflate(LAYOUT_RESOURCE, null);
        holder.title = (TextView) convertView.findViewById(R.id.txtTitle);
        holder.desc = (TextView) convertView.findViewById(R.id.txtDesc);
        holder.content = (TextView) convertView.findViewById(R.id.txtContent);
        holder.type = type;
        //setting tag to reduce hierarchy lookup
        convertView.setTag(holder);

    return convertView;
}
/**
 * Holder class to improve performance. Helps in reducing view hierarchy lookup
 */
private static class ViewHolder {

    TextView title;
    TextView desc;
    TextView content;
    int type;

}   

これは、少なくともビューをリサイクルしようとする最良の方法です。お役に立てれば

于 2012-11-28T14:15:26.457 に答える
-1

スクロールまたはビューの更新中に位置が変わる可能性があります。位置の代わりに配列を使用することをお勧めします

于 2012-11-28T12:44:43.503 に答える