我有导航抽屉中托管的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;正确完成它。提前谢谢。
答案 0 :(得分:2)
最后让它工作,万一其他人需要这个。我认为这是唯一可行的解决方法......
我添加了一个界面
public interface NavigationDrawerListHandler {
/**
* Called when an item in the navigation drawer is selected.
*/
void selectItem(int position);
}
NavigationDrawerFragment
和ProgramsCursorAdapter
实施NavigationDrawerListHandler
。
ProgramsCursorAdapter
还保留了通过方法
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);
}
希望这会有所帮助!