OnItemClickListener and OnClickListener in ListView

前端 未结 3 1200
野的像风
野的像风 2020-12-11 09:18

I have a custom view for each row in a custom ListAdapter and I am trying to perform onClick action and get the row position in the list where the click came from.

相关标签:
3条回答
  • 2020-12-11 09:29

    The other possible option to have the OnClickListener in the same class as the creating activity is to add to the activity implements OnItemClickListener.

    public class DisplayListCustom extends Activity implements OnItemClickListener
    

    Then set the custom list to listen

    ListView list = (ListView)findViewById(R.id.custom_list);
    list.setClickable(true);
    list.setOnItemClickListener(this);
    list.setAdapter(new CustomListAdapter(getApplicationContext(), listItems));
    

    Finally in the onItemClick return, you can find the inner views by using resource ID

    public void onItemClick(AdapterView<?> parent, View v, int position, long id) {
        LinearLayout listItem = (LinearLayout) v;
        TextView clickedItemView = (TextView) listItem.findViewById(R.id.name);
        String clickedItemString = clickedItemView.getText().toString();
        Log.i("DisplayListCustom", "Click detected " + clickedItemString + ", position " + Integer.toString(position));
    

    This is the solution I went with. I used LinearLayout for my custom layout container, but I assume the same applies to RelativeLayout.

    0 讨论(0)
  • 2020-12-11 09:34

    You could assign the proper OnClickListener to each ImageView and TextView from inside your ListAdapter's overridden getView method.

    Inside that method you know the item's position, so you can pass it to the custom listener classes, and use it there as you want:

    @Override
    public View getView(final int position, View convertView, ViewGroup parent)
    {
        // TODO: instantiate the layout 
        // here I call a super method
        final View view = super.getView(position, convertView, parent);
        final TextView textView = (TextView)view.findViewById(R.id.itemTxt);
        textView.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Log.i("Click", "TextView clicked on row " + position);
            }
        });
        final ImageView imageView = (ImageView)view.findViewById(R.id.delBtn);
        imageView.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v)
            {
                Log.i("Click", "ImageView clicked on row " + position);
            }
        });
        return view;
    }
    
    0 讨论(0)
  • 2020-12-11 09:36

    You need to extend your TextView etc, override the click method, do the appropriate actions and then the trick is to return false so it's then propagated to the listview.

    0 讨论(0)
提交回复
热议问题