1

ホルダーを3つ持っています。1アイテムにつき1ホルダー。メソッド getView は次のようになります。

public View getView(int position, View convertView, ViewGroup parent) {
    mCursor.moveToPosition(position);
    int type = checkDialogType(mCursor);
    Holder holder = null;
    if (convertView != null){
        holder = (Holder)convertView.getTag(type);
        if (holder == null){
            holder = createHolderByType(type, parent);
        }
    } else {
        holder = createHolderByType(type, parent);
    }
    return holder.fillView(mCursor, position);         //convertView
}

createHolderByType() の内容:

public Holder createHolderByType(int type, ViewGroup parent){
    View v;
    if (type == IN_TYPE){
        v = mInflater.inflate(R.layout.dialog_incoming_item, parent, false);
        return new InHolder(v, mCursor, mContext, this, IN_TYPE);
    } else if (type == OUT_TYPE){
        v = mInflater.inflate(R.layout.dialogs_outcoming_item, parent,false);
        return new OutHolder(v, mCursor, mContext, this, OUT_TYPE);
    } else {
        v = mInflater.inflate(R.layout.dialogs_chat_item, parent, false);
        return new ChatHolder(v, mCursor, mContext, this, CHAT_TYPE);
    }
}

それは正常に動作しますが、listView メソッド createHolderByType の 39 項目に対して 19 回呼び出されました。ホルダーを作成するには、xml をインフレートする必要があります。それは非常に高価です。ホルダーに同じビューを使用したり、ホルダーをメモリに保存しようとすると、機能しません。いくつかのトリックでパフォーマンスを向上させることはできますか?

UPD: ホルダーが 1 つあります。

public class InHolder extends Holder {
private View baseView;
private TextView fio;
private TextView message;
private TextView date;
private ImageView isOnline;
private int type;
private ImageView senderIMG;

public InHolder(View v, Cursor dialogCursor, Context context, DialogCurAdapter adapter, int type){
    super(dialogCursor, context, adapter);
    fio = (TextView)v.findViewById(R.id.fio);
    senderIMG = (ImageView)v.findViewById(R.id.sender_image);
    message = (TextView)v.findViewById(R.id.message_preview);
    date = (TextView)v.findViewById(R.id.date);
    isOnline = (ImageView)v.findViewById(R.id.isonline);
    this.type= type;
    baseView = v;
    baseView.setTag(type, this);
}

@Override
public View fillView(Cursor dialogCursor, final int position) {
    try{
        int ownerID = dialogCursor.getInt(ownerIndex);
        User usr = mDButils.getUserByID(ownerID);
        String messageText = Html.fromHtml(dialogCursor.getString(bodyIndex)).toString();
        date.setText(DateUtils.getTime(dialogCursor.getInt(dateIndex), mContext));
        message.setText(messageText);

        if (messageText == null || messageText.equals("")){
            if (dialogCursor.getInt(hasAttIndex) == 1){
                message.setText(mContext.getResources().getString(R.string.attachment));
                message.setTextColor(getColor(R.color.date_blue_to_white_selector));
            }

        }

        if (dialogCursor.getInt(hasAttIndex)  == 1){
            String[] attaches = dialogCursor.getString(attTypeIndex).split(",");
        }

        if (dialogCursor.getInt(readstateIndex) == 0){
            baseView.setBackgroundDrawable(getDrawable(R.drawable.lightblue_to_transparent_selector));
        } else baseView.setBackgroundDrawable(getDrawable(R.drawable.white_to_blue_selector));

        if (usr != null){
            mImageLoader.displayImage(usr.getImageURL(), senderIMG);
            fio.setText(usr.getFirstName() + " " + usr.getLastName());
            isOnline.setVisibility(usr.isOnLine()  == 1  ? View.VISIBLE : View.INVISIBLE);
        } else {
            AsyncUserLoader userLoader = new AsyncUserLoader(mContext) {
                @Override
                protected void onPostExecute(User user) {
                    if (user != null){
                        mDialogAdapter.updateItem(position);
                    }
                }
            };
            userLoader.execute(Integer.parseInt(ownerID + ""));
        }
    }catch (Exception e){
        e.printStackTrace();
    }
    return baseView;
}

@Override
public int getType() {
    return type;
}
}
4

2 に答える 2

0

この投稿とこの記事に示されているように、BaseAdapter に複数のレイアウトを実装できます。

: getItemViewType(int position) では、checkDialogType(mCursor); を使用できます。使用するレイアウト タイプを見つける。ただし、getItemViewType(int position) は 0 から 2 の間の値を返す必要があります (count が 3 の場合)。

于 2013-01-02T13:28:38.043 に答える
0

解決策を見つけました。必要なすべてのビューを表示するときに、複雑なコンテナーを作成しました。そして、ビューのタイプに応じて、それらを表示または非表示にします。したがって、convertView が型と一致しない場合、xml をインフレートする必要はありません。

于 2013-01-04T11:19:04.480 に答える