사용자 지정 ListAdapter를 사용하여 목록에서보기를 생성하는 간단한 ListActivity가 있습니다. 일반적으로 ListAdapter는 뷰를 TextViews로 채울 것이지만 이제는 버튼도 여기에 넣고 싶습니다.
그러나 목록 항목에 포커스 가능한 뷰를두면 목록 항목을 클릭 할 때 ListActivity에서 onListItemClick ()이 실행되는 것을 방지하는 것은 내 이해와 경험입니다. 버튼은 여전히 목록 항목 내에서 정상적으로 작동하지만 버튼 이외의 항목을 누르면 onListItemClick이 트리거되기를 원합니다.
이 작업을 어떻게 할 수 있습니까?
답변
이전 주석 솔루션 에서 썼 듯이 ImageButton에서 setFocusable (false)입니다.
목록 요소의 android:descendantFocusability="blocksDescendants"
루트 레이아웃 에 추가하려는 더 우아한 솔루션이 있습니다 . 그러면 ListItem에 대한 클릭이 가능하고 별도로 Button 또는 ImageButton 클릭을 처리 할 수 있습니다.
도움이되기를 바랍니다;)
건배
답변
여기서 도와 드릴 수 있기를 바랍니다. listView 항목에 대한 사용자 지정 레이아웃이 있다고 가정하고이 레이아웃은 버튼과 TextView, ImageView 등과 같은 다른보기로 구성됩니다. 이제 버튼 클릭시 다른 이벤트가 발생하고 클릭 된 다른 모든 이벤트에서 다른 이벤트가 발생하기를 원합니다.
ListActivity의 onListItemClick ()을 사용하지 않고도이를 달성 할 수 있습니다.
수행해야 할 작업은 다음과 같습니다.
사용자 지정 레이아웃을 사용하고 있으므로 사용자 지정 어댑터에서 getView () 메서드를 재정의하고있을 수 있습니다. 트릭은 버튼에 대해 다른 리스너를 설정하고 전체 뷰 (행)에 대해 다르게 설정하는 것입니다. 예를 살펴보십시오.
private class MyAdapter extends ArrayAdapter<String> implements OnClickListener {
public MyAdapter(Context context, int resource, int textViewResourceId,
List<String> objects) {
super(context, resource, textViewResourceId, objects);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String text = getItem(position);
if (null == convertView) {
convertView = mInflater.inflate(R.layout.custom_row, null);
}
//take the Button and set listener. It will be invoked when you click the button.
Button btn = (Button) convertView.findViewById(R.id.button);
btn.setOnClickListener(this);
//set the text... not important
TextView tv = (TextView) convertView.findViewById(R.id.text);
tv.setText(text);
//!!! and this is the most important part: you are settin listener for the whole row
convertView.setOnClickListener(new OnItemClickListener(position));
return convertView;
}
@Override
public void onClick(View v) {
Log.v(TAG, "Row button clicked");
}
}
OnItemClickListener 클래스는 다음과 같이 선언 할 수 있습니다.
private class OnItemClickListener implements OnClickListener{
private int mPosition;
OnItemClickListener(int position){
mPosition = position;
}
@Override
public void onClick(View arg0) {
Log.v(TAG, "onItemClick at position" + mPosition);
}
}
물론 OnItemClickListener 생성자에 더 많은 매개 변수를 추가 할 것입니다.
그리고 한 가지 중요한 것은 위에 표시된 getView의 구현이 매우 추악합니다. 일반적으로 findViewById 호출을 피하기 위해 ViewHolder 패턴을 사용해야하지만 이미 알고있을 것입니다.
내 custom_row.xml 파일은 ID “button”의 Button, ID “text”의 TextView 및 ID “image”의 ImageView가있는 RelativeLayout입니다.
문안 인사!
답변
사용자 지정 ListView에 포커스 가능한 요소가 포함되어 있으면 onListItemClick이 작동하지 않습니다 (예상되는 동작이라고 생각합니다). 사용자 정의보기에서 초점을 제거하면 트릭이 수행됩니다.
예를 들면 :
public class ExtendedCheckBoxListView extends LinearLayout {
private TextView mText;
private CheckBox mCheckBox;
public ExtendedCheckBoxListView(Context context, ExtendedCheckBox aCheckBoxifiedText) {
super(context);
…
mText.setFocusable(false);
mText.setFocusableInTouchMode(false);
mCheckBox.setFocusable(false);
mCheckBox.setFocusableInTouchMode(false);
…
}
}
답변
나는 같은 문제가 있습니다 : OnListItemClick not fired! [해결됨]
ListActivity를 확장하는 클래스에서 발생
합니다. TextBox 및 ListView를 포함하는 ListActivity의 레이아웃이 LinearLayout에 중첩되고
행에 대한 다른 레이아웃 (LineraLayout에 중첩 된 CheckBox 및 TextBox)이 있습니다.
그게 코드입니다.
res / layout / configpage.xml (ListActivity의 기본)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<TextView
android:id="@+id/selection"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="pippo" />
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:drawSelectorOnTop="false"
android:background="#aaFFaa" >
</ListView>
<LinearLayout>
res/layout/row.xml (layout for single row)
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content">
<CheckBox
android:id="@+id/img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
**android:focusable="false"**
**android:focusableInTouchMode="false"** />
<TextView
android:id="@+id/testo"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
**android:focusable="false"**
**android:focusableInTouchMode="false"** />
</LinearLayout>
src /…/…/ ConfigPage.java
public class ConfigPage extends ListActivity
{
TextView selection;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.configpage);
// loaded from res/value/strings
String[] azioni = getResources().getStringArray(R.array.ACTIONS);
setListAdapter(new ArrayAdapter<String>(this, R.layout.row,
R.id.testo, azioni));
selection = (TextView) findViewById(R.id.selection);
}
public void onListItemClick(ListView parent, View view, int position, long id)
{
selection.setText(" " + position);
}
}
row.xml에 추가하면 작동하기 시작합니다.
android:focusable="false"
android:focusableInTouchMode="false"
Eclipse 3.5.2
Android SDK 10.0.1
min SDK 버전을 사용합니다. 3
나는 이것이 도움이되기를 바랍니다
… 그리고 내 영어에 대해 죄송합니다 🙁
답변
android:focusable="false"
버튼의 속성 중 하나로 추가 하세요.
답변
ToggleButton에서 동일한 문제가 발생했습니다. 반나절 동안 벽에 머리를 부딪친 후 마침내 문제를 해결했습니다. ‘android : focusable’을 사용하여 포커스 가능한 뷰를 포커스 불가능하게 만드는 것만 큼 간단합니다. 또한 목록 행의 초점 및 클릭 가능성 (단어를 구성했습니다)을 사용하지 말고 기본값으로 두십시오.
물론 이제 목록 행의 포커스 가능한 뷰가 포커스를받을 수 없으므로 키보드를 사용하는 사용자는 포커스를 맞추는 데 문제가있을 수 있습니다. 문제가되지 않을 것 같지만 100 % 완벽한 앱을 작성하려는 경우 onItemSelected 이벤트를 사용하여 선택한 행의 요소에 초점을 맞추고 이전에 선택한 행의 요소에 초점을 맞출 수 없게 만들 수 있습니다.
답변
ListView lv = getListView();
lv.setTextFilterEnabled(true);
lv.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
// When clicked, show a toast with the TextView text
Toast.makeText(getApplicationContext(), ((TextView) view).getText(),
Toast.LENGTH_SHORT).show();
}
});
