Activity
クラスコード:
conversationList = (ListView)findViewById(Android.R.id.list);
ConversationArrayAdapter conversationArrayAdapter=new ConversationArrayAdapter(this, R.layout.conversation_list_item_format_left, conversationDetails);
conversationList.setAdapter(conversationArrayAdapter);
conversationList.setOnItemClickListener(new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
Log.d("test","clicked");
}
});
getView
クラスのAdapter
関数:
if (v == null) {
LayoutInflater vi = (LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if(leftSideMessageNumber.equals(m.getTo())) {
v = vi.inflate(R.layout.conversation_list_item_format_left, null);
} else {
v = vi.inflate(R.layout.conversation_list_item_format_right, null);
}
}
膨張中に2つのxmlを使用することに問題はありますか?
私はここから解決策を見つけました..しかし、深いクリックで...
リストの行項目にフォーカス可能なビューまたはクリック可能なビューが含まれている場合、OnItemClickListener
は機能しません。
行項目には、Android:descendantFocusability="blocksDescendants"
のようなパラメーターが必要です。
ここでは、リストアイテムがどのように見えるか、例を見ることができます。リストアイテムxmlは... row_item.xml(your_xml_file.xml)である必要があります
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="wrap_content"
Android:baselineAligned="false"
Android:descendantFocusability="blocksDescendants"
Android:gravity="center_vertical" >
// your other widgets here
</LinearLayout>
問題は、レイアウトにフォーカス可能なアイテムまたはクリック可能なアイテムが含まれていることです。ビューにフォーカス可能なアイテムまたはクリック可能なアイテムが含まれている場合、OnItemCLickListenerは呼び出されません。
詳細については、 here をクリックしてください。
そうでない場合は、レイアウトxmlのいずれかを投稿してください。
リストの場合、行にはボタンなどの他のクリックできるものがあるため、ブランケットブロックを実行しても子孫は機能しません。代わりに、ボタンのxmlに行を追加します。
Android:focusable="false"
これにより、ボタンが行のクリックをブロックするのを防ぎますが、それでもボタンがクリックすることを許可します。
listview_item.xmlで2つのステップを実行する必要があります
Android:descendantFocusability="blocksDescendants"
Android:clickable="false"
Android:focusable="false"
Android:focusableInTouchMode="false"
例を次に示します:listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:layout_marginBottom="10dp"
Android:layout_marginTop="10dp"
Android:paddingLeft="10dp"
Android:paddingRight="10dp"
Android:gravity="center_vertical"
Android:orientation="vertical"
Android:descendantFocusability="blocksDescendants">
<RadioButton
Android:id="@+id/script_name_radio_btn"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:textStyle="bold"
Android:textColor="#000"
Android:padding="5dp"
Android:clickable="false"
Android:focusable="false"
Android:focusableInTouchMode="false"
/>
</LinearLayout>
リストビューのカスタム行レイアウトのボタンタグ内で以下のコードを使用します
Android:focusable="false"
Android:clickable="false"
私は同じ問題を抱えていて、間違って設定したのを見ました:
@Override
public boolean isEnabled(int position)
{
return false;
}
customListViewAdapterクラスで。
これを次のように変更します。
return true;
私は問題を解決することができました。誰かが同じ間違いをした場合に備えて...
Android:descendantFocusabilityを使用します
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="80dip"
Android:background="@color/light_green"
Android:descendantFocusability="blocksDescendants" >
ルートレイアウトに上記を追加
この答え の助けを借りて解決しました
1. list_items.xmlの線形レイアウトに以下を追加しますAndroid:descendantFocusability="blocksDescendants"
2. list_items.xmlのLinearLayoutの子ビュー
Android:focusable="false"
私も同じ問題を抱えていましたが、チェックボックスを持っています、itemClickListenerが機能しないように以下を行いました、
チェックボックスに次のプロパティを追加しました。
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:clickable="false"
そしてItemClickListnerが働き始めました。
詳細な例については、リンクをご覧ください。
http://knowledge-cess.com/Android-itemclicklistner-with-checkbox-or-radiobutton/
応援よろしくお願いします!!
行ビューでのみクリックまたは選択可能なテキストビュー、ボタン、またはstgがある場合
Android:descendantFocusability="blocksDescendants"
十分ではありません。設定する必要があります
Android:textIsSelectable="false"
あなたのテキストビューに
Android:focusable="false"
ボタンやその他のフォーカス可能なアイテムに。
私は同じ問題を抱えていて、言及されたすべての解決策を試してみました。テストを通じて、テキストを選択可能にするとリスナーが呼び出されなくなることがわかりました。そのため、falseに切り替えるか、削除することで、リスナーが再度呼び出されました。
Android:textIsSelectable="false"
これが私のように立ち往生している人を助けることを願っています。
私の場合、XMLレイアウトプロパティはどれも役に立ちませんでした。
次のようなコードを1行追加するだけです。convertView.setClickable(false);
@NonNull
@Override
public View getView(final int position, View convertView, @NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null || convertView.getTag() == null) {
LayoutInflater inflater = LayoutInflater.from(context);
convertView = inflater.inflate(R.layout.my_layout_id, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
...
convertView.setClickable(false);
return convertView;
}
そのため、基本的にはxmlレイアウトでプロパティを設定するのと同じことを行いますが、私の場合はうまくいくだけです。
完璧なタイミングではありませんが、誰かの幸せなコーディングに役立つかもしれません
これは、フラグメントから拡張ListFragmentがアクティビティを作成する前にmListView.setOnItemClickListener
が呼び出されないことを知っている場合、アクティビティが作成されたときに確実に設定されるという2つの素晴らしいソリューションです。
@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);
}
これをメインレイアウトに追加する
Android:descendantFocusability="blocksDescendants"
OnClickがあるすべてのボタン、Textview、ImageViewなどにこのコードを記述します
Android:focusable="false"
Android:clickable="false"
それがうまくいくことを願っています。
私は同じ問題を抱えていました。「フォーカス可能な」属性を持つ行レイアウトのテキストにスタイルを使用していました。私はそれを削除した後に機能しました。
上記のすべてを試しましたが、何も機能しませんでした。
次のように問題を解決しました。
最初にListButton
というカスタムボタンを定義します
public class ListButton extends Android.widget.Button
{
private ButtonClickedListener clickListener;
public ListButton(Context context)
{
this(context, null);
}
public ListButton(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}
public ListButton(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public void setClickListener(ButtonClickedListener listener) {
this.clickListener = listener;
}
@Override
public boolean isInTouchMode() {
return true;
}
@Override
public boolean onTouchEvent(MotionEvent event) {
return false;
}
@Override
public boolean dispatchTouchEvent(MotionEvent event) {
switch (event.getAction())
{
case MotionEvent.ACTION_DOWN:
break;
case MotionEvent.ACTION_UP:
eventClicked();
break;
case MotionEvent.ACTION_CANCEL:
break;
case MotionEvent.ACTION_MOVE:
break;
default :
}
return true;
}
private void eventClicked() {
if (this.clickListener!=null) {
this.clickListener.ButtonClicked();
}
}
}
XMLは次のようになります。
<dk.example.views.ListButton
Android:id="@+id/cancel_button"
Android:layout_width="125dp"
Android:layout_height="80dp"
Android:text="Cancel"
Android:textSize="20sp"
Android:layout_margin="10dp"
Android:padding="2dp"
Android:background="#000000"
Android:textColor="#ffffff"
Android:textStyle="bold"
/>
次に、独自のButtonClicked
リスナーインターフェイスを定義します。
public interface ButtonClickedListener {
public void ButtonClicked();
}
次に、通常のOnClickListener
であるかのように、独自のリスナーを使用します。
final ListButton cancelButton = (ListButton) viewLayout.findViewById(R.id.cancel_button);
cancelButton.setClickListener(new ButtonClickedListener() {
@Override
public void ButtonClicked() {
//Do your own stuff here...
}
});
Android:autoText属性は、TextViewを自動フォーカス可能にします。
同じ問題に直面し、何時間も試してみました。上記のすべてを試した場合は、リストビューのレイアウト幅とリスト項目をwrap_contentからmatch_parentに変更してみてください。
private AdapterView.OnItemClickListener onItemClickListener;
@Override
public View getView(final int position, View convertView, final ViewGroup parent) {
.......
final View view = convertView;
convertView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClick(null, view, position, -1);
}
}
});
return convertView;
}
public void setOnItemClickListener(AdapterView.OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener;
}
次に、アクティビティでadapter.setOnItemClickListener()を使用してから、リストビューに添付します。
私のために働いたのは、row.xmlファイルのレイアウト内のすべてのサブビューに以下のコードを追加することでした:
Android:focusable="false"
Android:focusableInTouchMode="false"
だから私の場合:
<?xml version="1.0" encoding="utf-8"?>
<Android.support.constraint.ConstraintLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:app="http://schemas.Android.com/apk/res-auto"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent">
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/testingId"
Android:text="Name"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/dummyId"
Android:text="icon"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/assignmentColor"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:id="@+id/testID"
//other stuff
/>
<TextView
Android:focusable="false"
Android:focusableInTouchMode="false"
Android:text="TextView"
//other stuff
/>
</Android.support.constraint.ConstraintLayout>
そして、これは私のフラグメントサブクラスでの私のsetOnItemClickListener呼び出しです:
CustomListView = (PullToRefreshListCustomView) layout.findViewById(getListResourceID());
CustomListView.setAdapter(customAdapter);
CustomListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.d("Testing", "onitem click working");
// other code
}
});
here !から答えを得ました。
リストビューアイテムのシンプルクリックとロングクリックの両方を使用する場合は、ロングクリックにコンテキストメニューを使用することを実装するより良い方法です。特にリストビューに複数の行レイアウトがある場合は、setItemLongClickListenerの使用を避けてください。
上記はすべて失敗しました。しかし、私は問題を解決することができました(頭を叩いて何時間も後-Google、聞いているなら、可能であればコンパイラエラーの形で私が遭遇したものを修正することを検討してください)
ここでxmlレイアウトに追加するAndroid属性に注意する必要があります(この元の質問では、list_items.xmlと呼ばれます)。私にとって問題の原因は、EditTextビューからTextViewに切り替えて、変更による残りの属性が残っていることです(私の場合はinputType)。コンパイラはそれをキャッチせず、アプリを実行しようとしたときにクリック可能性が失敗しました。レイアウトxmlノードにあるすべての属性を再確認します。