3

通常、アダプタには、リストビューのパフォーマンスを最適化するためにこれがあります。

 @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            System.out.println("getView " + position + " " + convertView);
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item1, null);
                holder = new ViewHolder();
                holder.textView = (TextView)convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(mData.get(position));
            return convertView;
        }

ビューホルダーは次のとおりです。

public static class ViewHolder {
    public TextView textView;
}

しかし、ImabeViewを使用した1つ、CheckBoxを使用した1つ、EditTextを使用した1つなど、さまざまなタイプの行がある場合はどうなりますか。

最初のものは次のようになります:

@Override
public int getViewTypeCount() {

    return 3;
}

@Override
public int getItemViewType(int position) {

         //if something
         return 0
         //if something else
         return 1
         //if something different
         return 2
}

およびgetView();

getView(int position, View convertView, ViewGroup parent){

    //if convetView == null, getItemViewType(position) and depending on the type inflate respective layout
    convertView.setTag(holder);
   //else
    holder = (ViewHolder)convertView.getTag();
}

しかし、ViewHoldersについてはどうでしょうか。それぞれのホルダーのタイプに応じて、3つの異なるViewHolderを用意する必要がありますか?

私はこのようなものの例を見つけることができました。実際、私は複数のViewHolderを使用しているanuListViewを見たことがありません。

私はそれを正しい方法でやっていますか?

ありがとうございました

4

3 に答える 3

8

ListView単一のViewHolderクラス内のすべてのレイアウトから可能なすべてのビューを宣言することを妨げるものは何もありません(したがって、は、およびあなたの例からViewHolderの参照を保持します)。ImageViewCheckBoxEditText

の場合、そのタイプの行に対してのみビューを設定するgetViewメソッドでconvertViewは、内の他のすべてのビュー参照はになります。作業中の行のタイプを確認するだけでビューを使用し、その行に属するからのビューのみを取得するときが来ました。nullViewHolderViewHoldernullViewHolderViewHolder

行のタイプごとに3つのクラスを使用することもできますViewHolder(そして、それを膨らませるときに特定の行ごとにそれらを設定します)が、最初のバージョンの方が優れていると思います。最終的には、複数行タイプのメカニズムを適切に実装する限り、どちらの方法でもかまいません。

于 2012-11-02T13:19:24.943 に答える
1

-私はそれ3rowsではなく、3つの異なるコンポーネントを持つシングル だと信じています。row

-3つの異なるコンポーネントholder classを備えたシングルが必要です。

以下のリンクでこの例を参照してください。

http://www.ezzylearning.com/tutorial.aspx?tid=1763429

于 2012-11-02T12:58:19.087 に答える
0

私は2番目のKumarVivekMitraです。他の下にある3つのビューすべてを含む1つの行が必要です。ただし、別の行が必要な場合は、次のことを試してください。

- create a custom row and put all the 3 views in it.
- set the visibility of all these views to GONE
- get the reference of all three views in ViewHolder.
- when setting the list, change the visibility of those views which you want to show to VISIBLE.  
于 2012-11-02T13:27:07.073 に答える