9

かなり複雑なアイテムのギャラリーがあります。各アイテムは、画像と2つのボタンで構成されています。ギャラリーがすべての動作をロードすると、ボタンは想定どおりに動作し、ボタンが押された状態は、ボタンが実際に押されたときにのみ発生します。

ただし、ギャラリーをスクロールするとすぐにボタンが機能しなくなり、どこかをクリックするとボタンが押された状態になります。

この回答のようにOnDownイベントを渡さないLinearLayoutにすべてを埋め込もうとしましたが、これはクリックイベントをブロックするだけです。

Galleryは、このような複雑なレイアウトに理想的なウィジェットではないことは承知していますが、この問題に対するより良い回避策があるかどうか疑問に思っています。

アップデート:

アーキテクチャについて少し説明します。ListViewだけで構成されているListFragmentを含むFragmentActivityがあります。

ListViewは、いくつかのメタ情報とともに、より小さな要素(Bettable)のグループで構成されています。これらのグループはギャラリーとして実装されます。具体的には、Gallery(OneGalleryと呼ばれる)を拡張しました。これは、一度に1つのアイテムのみがスクロールされるようにし、スクロールが行われるときにギャラリーアイテムを変換します。これがそのためのコードです

こちらがギャラリー用のアダプターです

そしてここにBettableレイアウトのコードがあります

4

2 に答える 2

0

子ビューの周りに新しいラッパーレイアウトを追加し、setPressedをオーバーライドしてみてください。ギャラリーは子にその状態を渡すのをやめ、あなたが説明する前述の望ましくない動作は修正されます。

于 2012-08-19T23:03:10.410 に答える
-3

これは見解のリサイクルです。ViewHolderパターンを使用して、getView呼び出しごとにアイテムの状態を設定してみてください。これを行う場合は、複雑なオブジェクトでビューステートを保持する必要があります。たとえば、複雑なオブジェクトには、TextView、ImageView、およびCheckBoxが含まれています

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

    ComplexObject co = objects.get(position);

    // A ViewHolder keeps references to children views to avoid unneccessary calls
    // to findViewById() on each row.
    ViewHolder holder;

    // When convertView is not null, we can reuse it directly, there is no need
    // to reinflate it. We only inflate a new View when the convertView supplied
    // by ListView is null.
    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

        // Creates a ViewHolder and store references to the two children views
        // we want to bind data to.
        holder = new ViewHolder();
        holder.text = (TextView) convertView.findViewById(R.id.text);
        holder.icon = (ImageView) convertView.findViewById(R.id.icon);
        holder.checkbox = (CheckBox)convertView.findViewById(R.id.checkbox);
        convertView.setTag(holder);
    } else {
        // Get the ViewHolder back to get fast access to the TextView
        // and the ImageView.
        holder = (ViewHolder) convertView.getTag();
    }

    // Bind the data efficiently with the holder.
    holder.text.setText(co.getText());
    holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
    holder.checkbox.setChecked(co.isChecked());

    holder.checkbox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) {
                    co.setChecked(isChecked);
                }
            });


    return convertView;
}

protected class ViewHolder{
    TextView text;
    ImageView icon;
    CheckBox checkbox; 

}   

お役に立てば幸いです

于 2012-08-01T20:41:40.193 に答える