处理自定义列表项在导航抽屉ListView中单击

时间:2014-08-06 15:57:52

标签: android android-listview navigation navigation-drawer android-cursoradapter

我有导航抽屉中托管的ListView的自定义行,当我每行只有一个简单的TextView时,一切正常。

然后我决定为每一行添加两个ImageButtons,显示EDIT和DISCARD ImageButtons,这种情况下的问题是ImageButtons窃取焦点而ListView Adapter onItemClickListener不再接收onItemClick事件,因此主片段的内容可以&# 39; t相应地改变我在抽屉上点击的元素。

我使用自定义CursorAdapter来填充抽屉的ListView,因此我决定为该行的每个元素创建一个OnClickListener。现在,行中的每一项都会对点击事件作出正确反应......现在的问题是我无法将onClick事件从TextView元素传递到ListView,以便正确选择ListView中的项目。

custom_list_row.xml:

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

        <ImageButton
            android:id="@+id/drawer_list_item_discard"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/ic_discard"
            android:scaleType="centerCrop"
            android:layout_alignParentRight="true"
            android:background="@null"
            android:padding="0dp"/>

        <ImageButton
            android:id="@+id/drawer_list_item_edit"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/ic_edit" 
            android:scaleType="centerCrop"
            android:padding="0dp"
            android:background="@null"
            android:layout_toLeftOf="@id/drawer_list_item_discard"/>

        <TextView 
            android:id="@+id/drawer_list_item_text"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="5dp"
            android:layout_centerInParent="true"
            android:textColor="#000000"
            android:textSize="20dp"
            android:layout_toLeftOf="@id/drawer_list_item_edit" 
            android:layout_alignParentLeft="true" />

    </RelativeLayout>
在ProgramsCursorAdapter.java中的

bindView(...):

@Override
public void bindView(View v, Context context, Cursor c) {
    if (mContext == null) return;

    // Instances of the Views
    TextView tv_name = (TextView) v.findViewById(R.id.drawer_list_item_text);
    // Override fonts
    Typeface robotoLight = Typeface.createFromAsset(mContext.getAssets(), "fonts/Roboto-Light.ttf");
    if (tv_name != null) tv_name.setTypeface(robotoLight);
    // Retrieve values of the row
    String name = c.getString(c.getColumnIndex(DBHelper.TB_PROGRAM_NAME));
    // Assign retrieved value to the row
    tv_name.setText(name);

    tv_name.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            System.out.println("Program click!");
        }
    });

    //Set up imagebuttons
    ImageButton edit = (ImageButton) v.findViewById(R.id.drawer_list_item_edit);
    edit.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            System.out.println("Edit onclick!");
        }
    });

    ImageButton discard = (ImageButton) v.findViewById(R.id.drawer_list_item_discard);
    discard.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            System.out.println("Discard onclick!");
        }
    });
}

我在这里也看到了一些关于我现在面临的问题的帖子,但是没有人能想出如何解决这个问题,我认为我的方法很好,但我仍然可以& #39;正确完成它。提前谢谢。

1 个答案:

答案 0 :(得分:2)

最后让它工作,万一其他人需要这个。我认为这是唯一可行的解​​决方法......

我添加了一个界面

public interface NavigationDrawerListHandler {
    /**
     * Called when an item in the navigation drawer is selected.
     */
    void selectItem(int position);
}

NavigationDrawerFragmentProgramsCursorAdapter实施NavigationDrawerListHandlerProgramsCursorAdapter还保留了通过方法

传递给它的类型NavigationDrawerListHandler的引用

ProgramsCursorAdapter.java

public void attach(NavigationDrawerFragment f) {
    try {
        mCallbacks = (NavigationDrawerListHandler) f;
    } catch (ClassCastException e) {
        throw new ClassCastException(
                "Fragment must implement NavigationDrawerListHandler.");
    }
}

ProgramsCursorAdapter的新实例绑定到抽屉的ListView时调用,如下所示:

NavigationDrawerFragment.java

// Set up adapter and bind it to the list
ProgramsCursorAdapter adapter = new ProgramsCursorAdapter(getActionBar()
                .getThemedContext(), database.getPrograms(), CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER);
mDrawerListView.setAdapter(adapter);
// Attach this fragment to the adapter
adapter.attach(this);

这样,适配器可以直接访问属于NavigationDrawerFragment的setItem(int position)方法,并且可以从onClick(View v)调用setItem(int position),如下所示:

ProgramsCursorAdapter.java

@Override
public void bindView(View v, Context context, Cursor c) {
    /* ... */

    // Get the position of the clicked view
    final int p = c.getPosition();

    tv_name.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            System.out.println("Program click!");
            selectItem(p);
        }
    });

    /* ... */
}

@Override
public void selectItem(int position) {
    mCallbacks.selectItem(position);
}

希望这会有所帮助!