2

私はHorizo ​​ntalListViewhttps://github.com/vieux/Android-Horizo​​ntal-ListViewを持っており、その中にいくつかのアイテムがあります。これらの各アイテムには、テキストと画像を囲む相対的なレイアウトがあります。私はこの相対的なレイアウトにセレクターを追加しました、そしてそれは押されたときに各アイテムの相対的なレイアウトを白に設定する新しいバージョンのアンドロイドでうまく機能します。

問題は、Androidの古いバージョンでは、スクロールするとHorizo​​ntalListviewがおかしな動作を開始することです。これは、各相対レイアウトにandroid:clickable="true"を追加するためです。この属性を削除すると、HLVは正常に機能し始めますが、セレクターは機能しません。

これが私のレイアウトです:

<RelativeLayout
        android:id="@+id/marcoNota"
        android:layout_width="@dimen/tile_width"
        android:layout_height="@dimen/tile_height"
        android:background="@drawable/tile_selector"
        android:clickable="true"
        android:paddingBottom="2dp"
        android:paddingTop="2dp"
        android:paddingLeft="2dp"
        android:paddingRight="2dp"> 
</RelativeLayout>

アダプターにonTouchListenerを設定してみても、同じ結果が得られました。

Clickable = "true"を設定せずにセレクターを使用できるかどうか、またはこれを回避できるかどうかを知りたいです。

4

1 に答える 1

2

私はHorizo​​ntalListView.javaに次のメソッドを実装する際の問題を解決しました。

これは、Action_UPを検出するために使用されました(ユーザーが選択したビューから指を離し、相対レイアウトをペイントしてデフォルトの色に戻した場合)。

@Override
    public boolean onTouchEvent(MotionEvent event) {
        if(habilitar){
            if (event.getAction() == android.view.MotionEvent.ACTION_UP ||event.getAction() == android.view.MotionEvent.ACTION_CANCEL){
                for(int i=0;i<getChildCount();i++){
                    View child = getChildAt(i);
                    if (isEventWithinView2(event, child)) {
                        if(mOnItemUnSelectedListener != null){
                            mOnItemUnSelectedListener.onItemUnSelected(child);
                        }
                        break;
                    }
                    if(mOnItemUnSelectedListener != null && child != null){
                        mOnItemUnSelectedListener.onItemUnSelected(child);
                    }
                }
            }
        }

        return true;
    }

mOnGestureジェスチャー検出器宣言内で、この機能をonDownメソッドに追加しました。これにより、ユーザーがビューを押したときにコンテンツを保持している選択したアイテムの相対レイアウトをペイントできます。

for(int i=0;i<getChildCount();i++){
                    View child = getChildAt(i);
                    if (isEventWithinView2(e, child)) {
                        if(mOnItemSelected != null){
                            mOnItemSelected.onItemSelected(HorizontalListView.this, child, mLeftViewIndex + 1 + i, mAdapter.getItemId( mLeftViewIndex + 1 + i ));
                        }
                        break;
                    }
                }

次に、いくつかのリスナーを追加して、アダプターが押されたビューをペイントできるようにしました。選択解除されたリスナー用に、次のインターフェイスを実装しました。

private OnItemUnSelectedListener mOnItemUnSelectedListener;

public void setOnItemUnSelectedListener(OnItemUnSelectedListener listener ){
        mOnItemUnSelectedListener = listener;

}
public interface OnItemUnSelectedListener{
    public void onItemUnSelected(View v);
}

アイテム選択リスナーには、クラスですでに定義されているリスナーを使用しました。

private OnItemSelectedListener mOnItemSelected;

最後に私のアダプターでリスナーを設定しました:

HorizontalListView listview = (HorizontalListView) retval.findViewById(R.id.listviewH);
listview.setOnItemSelectedListener(this);
listview.setOnItemUnSelectedListener(this);

ユーザーがビューを押しているかどうかに応じて、レイアウトの色を設定します

@Override
    public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2,long arg3) {
        if(arg1.findViewById(R.id.marcoNota) != null){
            arg1.findViewById(R.id.marcoNota).setBackgroundColor(Color.WHITE);
        }

    }

    @Override
    public void onNothingSelected(AdapterView<?> arg0) {


    }

    @Override
    public void onItemUnSelected(View v) {
        if(v.findViewById(R.id.marcoNota) != null){
        v.findViewById(R.id.marcoNota).setBackgroundColor(Color.BLACK);
        }
    }

私はそれが非常に具体的な質問であることを知っていますが、ここでは誰かが同じことをする必要があるかどうかです。

于 2012-10-31T23:19:30.213 に答える