3

私はarrayadapterでリストビューを持っています。リスト項目内のボタンをクリックすると、その項目の特定のビュー (他の項目ではなく) が表示または非表示になります。

アダプターの getView() メソッドで行っているコードは次のとおりです。

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    if (convertView == null) {

        convertView = vi.inflate(layoutResourceId, null, false);
        holder = new Holder();
        holder.setShare((ImageView) convertView.findViewById(R.id.share));
        holder.setShareButtons((LinearLayout)convertView.findViewById(R.id.shareButtons));
        convertView.setTag(holder);


    }
    holder = (Holder) convertView.getTag();


    holder.getShare().setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {

            if(holder.getShareButtons().getVisibility()==View.GONE){
                holder.getShareButtons().setVisibility(View.VISIBLE);

            }
            else{
                holder.getShareButtons().setVisibility(View.GONE);

            }


        }
    });

    return convertView;
}

しかし、私が得ているのは奇妙な行動だけです。onClickListener および setVisibilty メソッドは正しく呼び出されますが、ビューが表示される場合と表示されない場合があり、これはリストのスクロール位置に依存します。

私が間違っていることと、これをどのように解決する必要がありますか?

4

3 に答える 3

4

リスト ビューがスクロールされると、子ビューが再利用され、新しい位置に再割り当てされます。新しいビューの作成にはコストがかかるため、これは効率化のためです。ただし、プログラマーには負担がかかります。getView を呼び出すたびに、ビューのすべての値を完全にリセットする必要があります。したがって、子のボタンを押すと、そのメンバーの 1 つの可視性が変化する場合、各数値位置の可視性を覚えておく必要があり、getView ですべての要素に適切な可視性を設定する必要があります。

于 2013-03-14T14:40:04.007 に答える
1

ホルダーは、パフォーマンス上の理由から内部ビューへの参照を保持するためのものです。リストに表示されるデータには関係ありません。リスト内の「セル」にのみ関係します。データに基づいて、ものが見えるかどうかを判断する必要があります。

于 2013-03-14T14:40:02.663 に答える
1

これは、アダプター自体内でアイテムのクリックに反応する方法の例を示すカスタム アダプターのスニペットです。

機能性: すべての行は、見えるオブジェクトと見えないオブジェクトを表します。見えるか見えないかでイメージが違います。アイテムをクリックすると、画像のオン/オフが切り替わります。

public class Exampledapter extends ArrayAdapter<CustomObject> {

    private Context mContext;
    private int mLayoutResourceId;
    private ArrayList<CustomObject> mData = null;

    public ExampleAdapter(Context context, int layoutResourceId, ArrayList<CustomObject> data, DataSource datasource) {
        super(context, layoutResourceId, data);
        this.mLayoutResourceId = layoutResourceId;
        this.mContext = context;
        this.mData = data;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View lRow = convertView;
        ViewHolder holder = null;

        if (lRow == null) {
            LayoutInflater lInflater = ((Activity) mContext).getLayoutInflater();
            lRow = lInflater.inflate(mLayoutResourceId, parent, false);

            holder = new ViewHolder();
            holder.txtTitle = (TextView) lRow.findViewById(R.id.text_);
            holder.imageSeen = (ImageView) lRow.findViewById(R.id.image_toggle);

            lRow.setTag(holder);
        } else {
            holder = (ViewHolder) lRow.getTag();
        }

        holder.imageSeen.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                onListItemClick(position);
            }
        });

        if (mData.get(position).getSeen() == 1) {
            holder.imageSeen.setImageBitmap(mImageSeen);
        } else {
            holder.imageSeen.setImageBitmap(mImageUnseen);
        }

        holder.txtTitle.setText(mData.get(position).getTitle());
        return lRow;
    }

    protected void onListItemClick(int position) {
        if (mData.get(position).isSeen()) {       
            mData.get(position).setSeen(0);
        } else {  
            mData.get(position).setSeen(1);
        }
        notifyDataSetChanged();
    }

    class ViewHolder {
        TextView txtTitle;
        ImageView imageSeen;
    }
}
于 2013-03-14T14:51:06.453 に答える