gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 00:17:57 25 4
gpt4 key购买 nike

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

然后我决定为每一行添加两个 ImageButtons,显示 EDIT 和 DISCARD ImageButtons,这种情况下的问题是 ImageButtons 窃取焦点并且 ListView Adapter onItemClickListener 不再接收 onItemClick 事件,因此主要 fragment 的内容不能'相应地更改我在抽屉上单击的元素。

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

自定义列表行.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>

bindView(...) 在 ProgramsCursorAdapter.java 中:

@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!");
}
});
}

我在这里也看到了一些关于我现在面临的问题的帖子,但没有人能弄清楚如何解决它,我认为我的方法很好,但我仍然无法解决做对了。提前致谢。

最佳答案

终于让它工作了,以防其他人需要它。我认为这是唯一可能的解决方法...

我添加了一个接口(interface)

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 的新实例像这样绑定(bind)到抽屉的 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);
}

希望这会有所帮助!

关于android - 处理自定义列表项在抽屉导航 ListView 内单击,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25164971/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com