简体   繁体   English

Android - 自定义 ArrayAdapter - 无法识别对 ListItems 的点击

[英]Android - Custom ArrayAdapter - Clicks on ListItems are not recognized

I implemented a custom ArrayAdapter which causes the problem that any click on the TextView element of the ListItem is not recognized by the ListView ;我实现了一个自定义ArrayAdapter ,这导致ListView无法识别对 ListItem 的 TextView 元素的任何点击; However clicking on the ImageView element of the ListItem leads to the desired effect.但是,单击 ListItem 的ImageView元素会产生所需的效果。 I just couldn't figure out how this behavior is caused even tough i followed the tutorials.我只是无法弄清楚这种行为是如何引起的,即使我遵循了教程。

Everything works just fine when i use the standard ArrayAdapater .当我使用标准ArrayAdapater时,一切正常。

I am going to include the involved classes since i don't know which of them is relevant to solve this issue.我将包括所涉及的类,因为我不知道其中哪些与解决此问题相关。

CustomArrayAdapter:自定义阵列适配器:

public class ClassCustomArrayAdapter extends ArrayAdapter {

    private ArrayList<ArrayList<String>> contactsArray;
    private Context context;

    public ClassCustomArrayAdapter(Context context, int textViewResourceId, ArrayList<ArrayList<String>> contactsArray) {

        super(context, textViewResourceId, contactsArray);

        this.contactsArray = contactsArray;
        this.context = context;
    }

    private class ViewHolder{
        ImageView imageView;
        TextView textView;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        ViewHolder viewHolder = null;

        LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if(convertView == null) {
            convertView = layoutInflater.inflate(R.layout.fragment_custom_listview_item, null);
            viewHolder = new ViewHolder();
            viewHolder.textView = (TextView) convertView.findViewById(R.id.tv);
            viewHolder.imageView = (ImageView) convertView.findViewById(R.id.iv);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }

        viewHolder.textView.setText(String.format("%s %s", contactsArray.get(position).get(2), contactsArray.get(position).get(1)));
        viewHolder.imageView.setImageResource(R.drawable.ic_baseline_person_24);

        return convertView;
    }

}

FragmentListContacts:片段列表联系人:

public class FragmentListContacts extends Fragment {

    private ArrayList<ArrayList<String>> contacts_arraylist;
    private ArrayList<ArrayList<String>> contacts_array_listview;
    private ArrayAdapter<String> contact_ids;
    private ArrayAdapter<ArrayList<String>> contacts_arrayadapter;
    private ListView contacts_listview;
    private FloatingActionButton add_contact_fab;
    private Database db;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_list_contacts, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        contacts_listview = getActivity().findViewById(R.id.contacts_listview);
        add_contact_fab = getActivity().findViewById(R.id.add_contact_fab);
        initAddContactFAB();
        db = new Database(getContext());
        //db.insertNewContact("A", "B", "123", "321");
        //db.insertNewContact("C", "D", "456", "654");
        contacts_arraylist = new ArrayList<>();
        contacts_arraylist.addAll(db.getContacts());

        //contacts_arrayadapter = new ArrayAdapter<ArrayList<String>>(getContext(), android.R.layout.simple_list_item_1, android.R.id.text1, contacts_arraylist);

        ClassCustomArrayAdapter classCustomArrayAdapter = new ClassCustomArrayAdapter(getContext(), R.layout.fragment_custom_listview_item, contacts_arraylist);
        //contacts_listview.setAdapter(contacts_arrayadapter);
        contacts_listview.setAdapter(classCustomArrayAdapter);
        
        contacts_listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Intent intent = new Intent(getContext(), ActivityListNotesByContact.class);
                startActivity(intent);
            }
        });

        registerForContextMenu(contacts_listview);
    }

    ...
}

custom_listview_item: custom_listview_item:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal"
    >

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:gravity="center_vertical"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:layout_marginRight="15dp"
        android:layout_marginTop="5dp"
        android:layout_marginBottom="5dp"
        android:longClickable="true"
        android:clickable="true"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:id="@+id/tv"
        android:gravity="center_vertical"
        android:padding="5px"
        android:layout_marginLeft="5dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentBottom="true"
        android:textSize="60px"
        android:textColor="#000000"
        android:background="#FFFFFF"
        android:longClickable="true"
        android:clickable="true"/>

</LinearLayout>

Thanks in advance!提前致谢!

the ListView setOnItemClickListener intercepts the clicks of the root view of the list item, and as you enable the TextView as clickable, then it has its own click listener that won't be intercepted by the ListView setOnItemClickListener . ListView setOnItemClickListener拦截列表项的根视图的点击,并且当您将TextView启用为可点击时,它有自己的点击监听器,不会被ListView setOnItemClickListener拦截。

Solution:解决方案:

You need to make both TextView and ImageView as not clickable or focus-able您需要将TextViewImageView都设置为不可点击或不可聚焦

android:clickable="false"
android:focusable="false"

You can use below list item layout..您可以使用下面的列表项布局..

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal">

    <ImageView
        android:id="@+id/iv"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="5dp"
        android:layout_marginRight="15dp"
        android:layout_marginBottom="5dp"
        android:gravity="center_vertical"
        android:clickable="false"
        android:focusable="false"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:clickable="false"
        android:focusable="false"
        android:layout_marginLeft="5dp"
        android:background="#FFFFFF"
        android:gravity="center_vertical"
        android:textColor="#000000" />

</LinearLayout>

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM