1

アプリの 1 つの画面に、ジェスチャに応答しない ListFragment が 1 つあります。他の画面では、ListFragments は適切に動作し、タッチに基づいて上下に移動します。しかし、このインスタンスはジェスチャーに反応して動きません。高さを特定のディップに設定して、ListFragment を ScrollView で囲みましたが、何も機能しません。ログは、リストに 3 つのエントリがあることを証明しますが、最初のエントリと 2 番目のエントリの半分しか表示されません。リストから最初のエントリを選択できます。

xml は次のとおりです。スクロールしていないのは、「 android:name="com.chex.control.LabelList"」 で識別される内部フラグメントです。

誰かがこの問題に遭遇して解決しましたか?

ありがとう

    <?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/new_interval_title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="New Interval" />

        <EditText
            android:id="@+id/days_in_interval"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="days in interval"
            android:inputType="number"
            android:singleLine="true" />

        <EditText
            android:id="@+id/goodi_goal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="goodi goal"
            android:inputType="number"
            android:singleLine="true" />

        <LinearLayout
            android:id="@+id/label_selector"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >

            <LinearLayout
                android:id="@+id/default_label_pane"
                android:layout_width="0px"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Default Labels" />

                <ScrollView
                    android:layout_width="match_parent"
                    android:layout_height="fill_parent"
                    android:scrollbars="vertical" >

                    <fragment
                        xmlns:android="http://schemas.android.com/apk/res/android"
                        android:id="@+id/default_labels_fragment"
                        android:name="com.chex.control.LabelList"
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@android:color/white"
                        android:focusable="true" >
                    </fragment>
                </ScrollView>
            </LinearLayout>

            <LinearLayout
                android:id="@+id/add_remove_label_selector"
                android:layout_width="0px"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical" >

                <Button
                    android:id="@+id/add_label_button"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Add" />

                <Button
                    android:id="@+id/remove_label_button"
                    android:layout_width="match_parent"
                    android:layout_height="wrap_content"
                    android:text="Remove" />
            </LinearLayout>

            <LinearLayout
                android:id="@+id/label_pane"
                android:layout_width="0px"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:orientation="vertical" >

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Inteval Labels" />

                <fragment
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    android:id="@+id/interval_labels_fragment"
                    android:name="com.chex.control.IntervalLabelList"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:focusable="true" >
                </fragment>

                <EditText
                    android:id="@+id/new_label"
                    android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:hint="new label"
                    android:inputType="text"
                    android:singleLine="true" />
            </LinearLayout>
        </LinearLayout>

        <LinearLayout
            android:id="@+id/keep_discard_button_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" >

            <Button
                android:id="@+id/keep_interval_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Keep" />

            <Button
                android:id="@+id/discard_interval_button"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:text="Discard" />
        </LinearLayout>
    </LinearLayout>
</ScrollView>

ここにフラグメント.javaがあります

package com.chex.control;


import java.util.ArrayList;

import com.chex.R;
import com.chex.storage.Child;
import com.chex.storage.DatabaseConstants;
import com.chex.storage.DatabaseHelper;
import com.chex.storage.DatabaseIO;
import com.chex.storage.Label;

import android.app.Activity;
import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.ListActivity;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.net.Uri;
import android.os.Bundle;
import android.provider.ContactsContract;
import android.support.v4.app.ListFragment;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.CursorAdapter;
import android.support.v4.widget.SimpleCursorAdapter;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemLongClickListener;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

/**
 * presents all the labels on the device.
 */
public class LabelList extends ListFragment implements DatabaseConstants,
        GoodiList {

    private final String TAG = "LabelList";

    ArrayAdapter<Label> adapter = null;

    private ListParent parentActivity;

    private Label[] values;

    private Label currentItem;

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

        Log.e(TAG, "on Create");
        ArrayList<Label> labelList = Label.getLabelsForInterval();

        Log.i(TAG,labelList.size()+" labels");
        // adapter = new IntervalListAdapter(getActivity(), values);

        adapter = new IntervalListAdapter(getActivity(), labelList);

        setListAdapter(adapter);

        Log.e(TAG, "finished on Create");
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.support.v4.app.Fragment#onActivityCreated(android.os.Bundle)
     */
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onActivityCreated(savedInstanceState);

        LongClickListener longClickListener = new LongClickListener();

        getListView().setOnItemLongClickListener(longClickListener);
    }

    /**
     * create and return a CursorLoader that will take care of creating a Curso
     * for the data being displayed.
     */

    /**
     * this used to delete. However, we need it to select usually. Now delete is
     * done by long click.
     */
    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
        super.onListItemClick(l, v, position, id);

        // delete child - remove child from list and database
        Object item = l.getItemAtPosition(position);

        currentItem = (Label) item;

        Log.e(TAG,
                "selected " + currentItem.getLabel() + " id: "
                        + currentItem.getId() + " at position " + position);

        parentActivity.listItemSelected(this, position, currentItem.getId());

    }

    /**
     * Forces cursor to requery database and list to be update. Used when a new
     * child is entered in parent activity's EditText field.
     */
    public void notifyDataChanged() {

        Log.e(TAG, "told adapter that data changed");

        adapter.notifyDataSetChanged();
    }

    /*
     * (non-Javadoc)
     * 
     * @see android.support.v4.app.Fragment#onAttach(android.app.Activity)
     */
    @Override
    public void onAttach(Activity activity) {
        super.onAttach(activity);

        parentActivity = (ListParent) activity;

        parentActivity.setList(this);

    }

    class LongClickListener implements OnItemLongClickListener {

        public boolean onItemLongClick(AdapterView<?> adapterView, View view,
                int position, long id) {
            // delete child - remove child from list and database

            // adapter view. Can always call parent's getItemAtPosition
            final Object item = adapterView.getItemAtPosition(position);

            final Label label = (Label) item;

            final String name = label.getLabel();

            Log.e(TAG, "selected " + name + " at position " + position
                    + " now we'll delete them");

            // make sure user wants to delete
            AlertDialog.Builder alert = new AlertDialog.Builder(getActivity());

            alert.setTitle("Delete " + name + "?");

            alert.setPositiveButton("Yes",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            Label.deleteLabel(name);

                            adapter.remove(label);

                            // update the list
                            notifyDataChanged();

                        }
                    });

            alert.setNegativeButton("No",
                    new DialogInterface.OnClickListener() {

                        @Override
                        public void onClick(DialogInterface dialog, int which) {

                            // nothing happens - child remains

                        }
                    });

            alert.show();

            return true;
        }

    }

    @Override
    public void addListItem(int itemId) {
        Label labelToAdd = Label.lookupLabel(itemId);

        if (labelToAdd == null) {
            Log.e(TAG, "didn't find a label for label id " + itemId);

        } else {
            Log.e(TAG, "adding label: " + labelToAdd.getLabel() + "  "
                    + labelToAdd.getId() + "  id argument: " + itemId);

            // breaks because the adapter is currently strings
            adapter.add(labelToAdd);

            notifyDataChanged();
        }
    }

    @Override
    public void removeListItem(int itemId) {
        // TODO Auto-generated method stub

    }

    @Override
    public void removeListItem() {
        // TODO Auto-generated method stub

    }


    @Override
    public void highlightListIndex(int index) {
        ListView listView = getListView();
        listView.setItemChecked(index, true);
    }

} 
4

1 に答える 1

0

あなたの場合のように、スクロールビューでのスクロールビューでは、Androidは最適ではありません。この状況を回避する必要があります。これらの競合を回避するためにレイアウトを変更してみてください。

a** メソッドの問題は、親のタッチ イベントをインターセプトし (ジェスチャ リスナーも追加します)、ユーザーがリストフラグメントでスクロールを行ったときにイベントをリストフラグメントに渡すことです (内部のフラグメントの座標を知る必要があります)。画面など)。そのままの方がはるかに簡単に聞こえますが、その後は多くの問題が発生するため、代わりにレイアウトを書き直すことをお勧めします.

于 2013-04-11T11:08:40.997 に答える