web-dev-qa-db-ja.com

フラグメント内のリストビューのOnItemClickListenerが機能しない

編集:解決済み。アイテムのXMLにフォーカスできるものがあれば、リストのタッチを壊します。つまり、Android:focusable = falseはすべてのチェックボックス、スイッチ、またはurリストのそれに似ています。 。そして完了=)

わかりました、これが私の問題です。

私はタブとフラグメントを使用するアプリを作成しましたが、listViewでonItemClickをキャプチャしようとしたときにタッチ/押された/選択された行

私は少し読んでいて、多くの人が同じ問題を抱えていますが、私を助けてくれる応答はまったく見つかりませんでした。

私はListFragmentを実装したくありません。実際、どのように/なぜすべきかさえわかりません。また、すべてのコードが既に機能しているので、実装するとさらに多くの作業が必要になるかどうかわかりません。だから、ここにあります:

フラグメント内で、listViewをクリックするためのリスナーを実装することは可能ですか?もしそうなら、どうやって?

PD:minSDK = 14、tatgetSDK = 15

14
Dunnow

ここにあなたが望むことをするコードスニペットがあります。

ListView lv;

//code to get the listView instance using findViewByID etc

lv.setOnItemClickListener(new OnItemClickListener()
{
    @Override public void onItemClick(AdapterView<?> arg0, View arg1,int position, long arg3)
    { 
        Toast.makeText(EnclosingActivity.this, "Stop Clicking me", Toast.LENGTH_SHORT).show();
    }
});

人々は通常これでつまずきます、これがカバーされているかどうかを確認してください:

すべてのクリックとコールバック(例:メニュー/アクションバーのコールバック)は、フラグメントがバインドされているアクティビティに送信されるため、フラグメントクラスではなく、アクティビティクラスにある必要があります。

4
Dheeraj Bhaskar

置くだけ

Android:focusable="false"
Android:clickable="false"

レイアウト。すべてのテキストビュー、ボタンなど。

9
Ashwin S Ashok

これは役に立つかもしれません下のリンクのraghunanadanによる答えは私の問題を解決しました

listview OnItemClickリスナーはフラグメントでは機能しません

これをレイアウトに追加

Android:descendantFocusability="blocksDescendants"

5
Vinay

2つの素晴らしい解決策はこれでした。フラグメントからListFragmentを拡張する場合、@ dheeraj-bhaskarが暗示するように、アクティビティが作成される前にmListView.setOnItemClickListenerが呼び出されないことを知ってください。このソリューションにより、アクティビティが作成されたときに確実に設定されます

@Override
    public void onActivityCreated(Bundle savedInstanceState)
    {
        super.onActivityCreated(savedInstanceState);
        mListView.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long rowId) {
                // Do the onItemClick action

                Log.d("ROWSELECT", "" + rowId);
            }
        });
    }

ListFragmentのソースコードを見ていると、これに遭遇しました

    public class ListFragment extends Fragment {
        ...........................................
     ................................................

        final private AdapterView.OnItemClickListener mOnClickListener
                = new AdapterView.OnItemClickListener() 
{
            public void onItemClick(AdapterView<?> parent, View v, int position, long id) 
{
                onListItemClick((ListView)parent, v, position, id);
            }
        };
       .................................................................
    ........................................................................

    public void onListItemClick(ListView l, View v, int position, long id) 
{
        }
}

onItemClickListenerオブジェクトがアタッチされ、onListItemClick()を呼び出します。このように、onListItemClick()をオーバーライドすることでまったく同じように機能する他の同様のソリューション

 @Override
        public void onListItemClick(ListView l, View v, int position, long rowId) {
            super.onListItemClick(l, v, position, id);
           // Do the onItemClick action

                    Log.d("ROWSELECT", "" + rowId);
        } 
2
Rowland Mtetezi

データをフラグメントからリストビューのアクティビティに渡したい場合は、次のようにコードを変更できます...

class HistoryFragment extends Fragment {  ListView historyListView;
public HistoryFragment() {
    // Required empty public constructor
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {

    View v= inflater.inflate(R.layout.fragment_history, container, false);
    historyListView= (ListView) v.findViewById(R.id.historyDataListView);

    sendRequest();  //it is my meathod to load the listview and set the adapter
    return  v;
}

public void onStart() {
    super.onStart();
    historyListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            Intent intent=new Intent(getActivity(), DisplayDetails.class);

            intent.putExtra("text", historyListView.getItemAtPosition((int) l).toString());
            startActivity(intent);
          //  Toast.makeText(getActivity(),"Hello.. "+historyListView.getItemAtPosition((int) l).toString(),Toast.LENGTH_LONG).show();
        }
    });
}}
1
Javed

ワークフローの概要は次のとおりです。ListViewを作成し、それに対応するAdapter(基になるデータをListViewの項目にマップするために使用)、アダプターをListViewに設定して、追加しますOnItemClickListenerをそれに。

詳細とサンプルコードは次の場所にあります http://developer.Android.com/guide/topics/ui/declaring-layout.html#AdapterViews

0
Brent Hronik