1

実際にはネストされたリストビューを使用しています。親リストビューには、カスタムアダプタと子用の通常のリストビューがあります。

私は使用できることを知っていますexpandable list view。しかし、私のシナリオでは、子アイテムを処理するのはより複雑です。多くのコンポーネントがあります。

これが私が試したものです。親リストのボタンをクリックすると、対応する子リストの項目が表示されます。それはうまく機能しています。しかし、問題はスクロールだけです。子リストをスクロールしたかったのですが、親リストがスクロールしています。私は両方setScrollContainer(false)setClickable(false)(試したばかりの)親のために試しましたが、役に立たなかった。

これは私のコードです。

activity_main.xml

<RelativeLayout
    android:id="@+id/parent_rel"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:paddingBottom="@dimen/activity_vertical_margin" >

    <Button
        android:id="@+id/b_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="15dp"
        android:text="View" />

    <TextView
        android:id="@+id/parent_txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBaseline="@+id/b_view"
        android:layout_alignBottom="@+id/b_view"
        android:layout_alignParentLeft="true"
        android:layout_marginLeft="96dp"
        android:text="TextView" />
</RelativeLayout>

<RelativeLayout
    android:id="@+id/child_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_alignLeft="@+id/parent_rel"
    android:layout_below="@+id/parent_rel"
    android:visibility="gone" >

    <ListView
        android:id="@+id/ch_listView"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:background="#000000" >
    </ListView>
</RelativeLayout>

MainActivity.java

パブリッククラスMainActivityはListActivityを拡張します{

ListView lv;
String[] prnt_items = { "a", "b", "c", "d", "e", "f", "g", "h", "i", "j" };
boolean isViewing = false;
RelativeLayout layout;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    lv = getListView();
    lv.setCacheColorHint(Color.parseColor("#00000000"));
    lv.setAdapter(new ParentItems());

}

class ParentItems extends BaseAdapter {

    @Override
    public int getCount() {
        return prnt_items.length;
    }

    @Override
    public Object getItem(int position) {
        return prnt_items[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

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

        final View p_v = getLayoutInflater().inflate(
                R.layout.activity_main, parent, false);

        TextView tv = (TextView) p_v.findViewById(R.id.parent_txt);

        tv.setText(prnt_items[position]);
        Button sub_view = (Button) p_v.findViewById(R.id.b_view);

        sub_view.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                if (!isViewing) {
                    lv.setScrollContainer(false);
                    //lv.setClickable(false);
                    isViewing = !isViewing;
                    layout = (RelativeLayout) p_v.findViewById(R.id.child_view);
                    layout.setVisibility(View.VISIBLE);
                    ListView c_lv = (ListView) p_v.findViewById(R.id.ch_listView);
                    c_lv.setAdapter(new ArrayAdapter<String>(
                            getApplicationContext(),
                            android.R.layout.simple_list_item_1,
                            new String[] { "Hello", "Hai", "Oops!!!" }));
                    c_lv.setOnItemClickListener(new OnItemClickListener() {

                        @Override
                        public void onItemClick(AdapterView<?> arg0,View arg1, int arg2, long arg3) {
                            Toast.makeText(getApplicationContext(),
                                    "Click @ " + arg2, Toast.LENGTH_SHORT)
                                    .show();
                        }

                    });
                }
                else{
                    if(layout !=null){
                        isViewing = !isViewing;
                        lv.setScrollContainer(true);
                        //lv.setClickable(true);
                        layout.setVisibility(View.GONE);
                    }
                }
            }
        });

        return p_v;
    }
}

}

助けに感謝します。

ありがとう。

4

1 に答える 1

13

この問題は、独自のスクロールを持つビューを、スクロール機能を備えた別のビュー内に配置した場合に発生します。

これは、内部リストビューで試す必要があるものです

ListView lv = (ListView)findViewById(R.id.myListView);  // your listview inside scrollview
lv.setOnTouchListener(new ListView.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            int action = event.getAction();
            switch (action) {
            case MotionEvent.ACTION_DOWN:
                // Disallow ScrollView to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(true);
                break;

            case MotionEvent.ACTION_UP:
                // Allow ScrollView to intercept touch events.
                v.getParent().requestDisallowInterceptTouchEvent(false);
                break;
            }

            // Handle ListView touch events.
            v.onTouchEvent(event);
            return true;
        }
    });

子に触れたときに親のスクロールを無効にします。

于 2013-03-05T12:12:08.833 に答える