code

목록의 버튼으로 Listactivity에서 onListItemClick을 실행하는 방법은 무엇입니까?

codestyles 2020. 9. 7. 08:09
반응형

목록의 버튼으로 Listactivity에서 onListItemClick을 실행하는 방법은 무엇입니까?


사용자 지정 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입니다.
문안 인사!


When a custom ListView contains focusable elements, onListItemClick won't work (I think it's the expected behavior). Just remove the focus from the custom view, it will do the trick:

For example:

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);
    }
}

I have the same problem: OnListItemClick not fired ! [SOLVED]
That's happen on class that extend ListActivity,
with a layout for ListActivity that content TextBox and ListView nested into LinearLayout
and another layout for the rows (a CheckBox and TextBox nested into LineraLayout).

That's code:

res/layout/configpage.xml (main for 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&lt;String&gt;(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);
    }
}

This begin to work when I added on row.xml

  • android:focusable="false"
  • android:focusableInTouchMode="false"

I use Eclipse 3.5.2
Android SDK 10.0.1
min SDK version: 3

I hope this is helpful
... and sorry for my english :(


just add android:focusable="false" as one of the attributes of your button


I've had the same problem with ToggleButton. After half a day of banging my head against a wall I finally solved it. It's as simple as making the focusable view un-focusable, using 'android:focusable'. You should also avoid playing with the focusability and clickability (I just made up words) of the list row, just leave them with the default value.

Of course, now that your focusable views in the list row are un-focusable, users using the keyboard might have problems, well, focusing them. It's not likely to be a problem, but just in case you want to write 100% flawless apps, you could use the onItemSelected event to make the elements of the selected row focusable and the elements of the previously selected row un-focusable.


 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();
}
});

I used the getListAdapter().getItem(position) instantiating an Object that holds my values within the item

MyPojo myPojo = getListAdapter().getItem(position);

then used the getter method from the myPojo it will call its proper values within the item .

참고URL : https://stackoverflow.com/questions/1821871/how-to-fire-onlistitemclick-in-listactivity-with-buttons-in-list

반응형