1

if(converView==null) { } else { } if(converView==null) { } else { } についてのすべては何ですか?else part なしで正常に動作するかどうか知りたかっただけです。誰かが convertview の gettag と settag について説明できますか?

            public View getView(int position, View convertView, ViewGroup parent) {
        DeviceViewHolder holder = null;
        mSelectedDeviceBin = getItem(position);

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.single_device_view, null);
            holder = new DeviceViewHolder();
            holder.deviceId = (TextView) convertView
                    .findViewById(R.id.deviceId);

            holder.deviceType = (TextView) convertView
                    .findViewById(R.id.deviceType);

            convertView.setTag(holder);

        } else

            holder = (DeviceViewHolder) convertView.getTag();

        // Populating the views
        holder.deviceId.setText(mSelectedDeviceBin.getDeviceBinId());

        StringBuilder deviceCount = new StringBuilder();
        deviceCount.append("");
        double count = mSelectedDeviceBin.getQtyStock();
        deviceCount.append(count);
        String deviceCountString = deviceCount.toString();
        holder.deviceType.setText("Total number of Items:"
                + deviceCountString);

        return convertView;
    }
4

1 に答える 1

6

実装は convertViews と ViewHolder パターンを使用し、次のように機能します。

リスト内の項目ごとに新しいビューを作成する代わりに、Android は表示可能な数だけビューを作成します。ビューが画面の外に出ると、再利用されます。このようにして、比較的遅い inflate 呼び出しの数が最小限に抑えられます。

第 2 に、ViewHolder パターンは、ビューの検索 (findViewById()) の数が最小限に抑えられるようにします。これは、特にスクロール時に比較的遅いためです。そのため、毎回ビューを見つける代わりに、直接参照がメモリに保持され、ViewHolder に格納されます。正しい ViewHolder オブジェクトが正しいアイテム ビューで格納されるようにするために、それらは view.setTag() を使用して convertView 内に設定されます。getTag() 呼び出しを使用して取得できます。

そうしないと、viewHolder 変数が null になり、アプリがクラッシュするためです。

明確にするために、else を次のように書くことをお勧めします。

} else {
    holder = (DeviceViewHolder) convertView.getTag();
}

編集: また、LayoutInflator の作成を if(convertView == null){} ステートメント内に移動することもできます。それ以外の場合は必要ありません。

于 2013-10-23T13:58:18.887 に答える