編集:解決済み。アイテムのXMLにフォーカスできるものがあれば、リストのタッチを壊します。つまり、Android:focusable = falseはすべてのチェックボックス、スイッチ、またはurリストのそれに似ています。 。そして完了=)
わかりました、これが私の問題です。
私はタブとフラグメントを使用するアプリを作成しましたが、listViewでonItemClickをキャプチャしようとしたときにタッチ/押された/選択された行
私は少し読んでいて、多くの人が同じ問題を抱えていますが、私を助けてくれる応答はまったく見つかりませんでした。
私はListFragmentを実装したくありません。実際、どのように/なぜすべきかさえわかりません。また、すべてのコードが既に機能しているので、実装するとさらに多くの作業が必要になるかどうかわかりません。だから、ここにあります:
フラグメント内で、listViewをクリックするためのリスナーを実装することは可能ですか?もしそうなら、どうやって?
PD:minSDK = 14、tatgetSDK = 15
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();
}
});
すべてのクリックとコールバック(例:メニュー/アクションバーのコールバック)は、フラグメントがバインドされているアクティビティに送信されるため、フラグメントクラスではなく、アクティビティクラスにある必要があります。
置くだけ
Android:focusable="false"
Android:clickable="false"
レイアウト。すべてのテキストビュー、ボタンなど。
これは役に立つかもしれません下のリンクのraghunanadanによる答えは私の問題を解決しました
listview OnItemClickリスナーはフラグメントでは機能しません
これをレイアウトに追加
Android:descendantFocusability="blocksDescendants"
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);
}
データをフラグメントからリストビューのアクティビティに渡したい場合は、次のようにコードを変更できます...
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();
}
});
}}
ワークフローの概要は次のとおりです。ListView
を作成し、それに対応するAdapter
(基になるデータをListViewの項目にマップするために使用)、アダプターをListViewに設定して、追加しますOnItemClickListener
をそれに。
詳細とサンプルコードは次の場所にあります http://developer.Android.com/guide/topics/ui/declaring-layout.html#AdapterViews