带有复选框onListItemClick的ListFragment永远不会被调用

问题描述 投票:0回答:2

我已经阅读了thisthis之类的一些SO问题,但仍然无法弄清楚我的代码有什么问题。我有一个ListFragment,每一行都有一个TextView和一个CheckBox。单击CheckBox是有效的,但是单击TextView则没有任何作用,也不会调用OnListItemClick。我还尝试过动态添加OnClickListener,以使其正常工作,但这不是正确的方法,并且它也缺少点击的GUI反馈(一秒钟被“突出显示”)。 >

这是我用于每个项目的textview_with_checkbox.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:clickable="true"
    android:focusable="true"
    android:gravity="left"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal" >
<TextView
    android:id="@+id/textview_event_name"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:paddingLeft="3dp"
    android:paddingTop="5dp"
    android:focusable="true"
    android:singleLine="false" />

<CheckBox
    android:id="@+id/checkbox_for_event_name"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="0.05"
    android:focusable="false"
    android:clickable="false" />

</LinearLayout>

现在的代码:

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

@Override
public void onListItemClick(ListView l, View v, int position, long id) 
{
    super.onListItemClick(l, v, position, id);

    String chosenItem = (String) getListAdapter().getItem(position);
    mCallBack.onEventItemSelected(chosenItem);

}

static class myCustomAdapterViewHolder
{
    public TextView eventName;
    public CheckBox eventCheckBox;
}

private class myCustomAdapter extends ArrayAdapter<String>
{   
    private ArrayList<String> sortedList;
    private Context m_oContext;
    List<String> m_oValues = null;

    public myCustomAdapter(Context cont, int viewResId, List<String> objects) 
    {
        super(cont, viewResId, objects);
        m_oContext = cont;
        m_oValues = objects;
        sortedList = new ArrayList<String>();
        for (String str : objects)
            sortedList.add(str);
        java.util.Collections.sort(sortedList);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View l_oRowView = convertView;
        myCustomAdapterViewHolder l_oInitializedViewHolder = null;
        final int l_nPosition = position;
        // Use convertView if possible, otherwise inflate a view:
        if (l_oRowView == null)
        {
            LayoutInflater inflater = (LayoutInflater) m_oContext
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            l_oRowView = inflater.inflate(R.layout.textview_with_checkbox, parent, false);

            // PlaceHolder pattern:
            final myCustomAdapterViewHolder l_oViewHolder = new myCustomAdapterViewHolder();
            l_oViewHolder.eventName = (TextView) l_oRowView.findViewById(R.id.textview_event_name);
            l_oViewHolder.eventCheckBox = (CheckBox) l_oRowView.findViewById(R.id.checkbox_for_event_name);

            l_oViewHolder.eventCheckBox.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    CheckBox cb = (CheckBox)v;
                    //cb.setChecked(!cb.isChecked());

                    String l_sFilename = l_oViewHolder.eventName.getText().toString();
                    if (cb.isChecked())
                    {
                        if (!m_lstSelectedFilenames.contains(l_sFilename))
                            m_lstSelectedFilenames.add(l_sFilename);
                    }
                    else
                    {
                        if (m_lstSelectedFilenames.contains(l_sFilename))
                            m_lstSelectedFilenames.remove(l_sFilename);
                    }
                }
            });
            l_oViewHolder.eventCheckBox.setFocusable(false);
            //l_oViewHolder.eventCheckBox.setClickable(false);
            // "Add" the viewHolder as a tag:
            l_oRowView.setTag(l_oViewHolder);
            l_oInitializedViewHolder = l_oViewHolder;
        }
        else
            l_oInitializedViewHolder = (myCustomAdapterViewHolder) l_oRowView.getTag();

        // By now, the rowView is initialized, just get the viewHolder and then get the views from it, to update:
        //myCustomAdapterViewHolder l_oViewHolder = (myCustomAdapterViewHolder) l_oRowView.getTag();
        /*l_oInitializedViewHolder.eventName.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                mCallBack.onEventItemSelected((String)getListAdapter().getItem(l_nPosition));

            }
        });*/
        l_oInitializedViewHolder.eventName.setText(m_oValues.get(position));
        return l_oRowView;
        //return super.getView();
    }

    public myCustomAdapter(Context cont, int viewResId, String[] strings) 
    {
        this(cont, viewResId, Arrays.asList(strings));
    }

    @Override
    public String getItem(int position) 
    {
        return sortedList.get(position);
    }

    @Override
    public int getPosition(String item) 
    {
        return sortedList.indexOf(item);
    }

}

我在这里做错了什么?我想要的是能够使用CheckBox es

选择要删除的“文件”

我已经读过类似这样的一些问题,但是仍然无法弄清楚我的代码有什么问题。我有一个ListFragment,并且每一行都有一个TextView和一个CheckBox。单击复选框是...

android checkbox textview android-listfragment
2个回答
0
投票

[仅尝试将onclick用于textview和checkbox,而不是onListItemClick-也可以将其删除-,因此也应更改线性布局的某些属性。


0
投票

添加以下属性:

© www.soinside.com 2019 - 2024. All rights reserved.