【问题标题】:Get the position of a button clicked in ListView获取ListView中点击按钮的位置
【发布时间】:2015-06-10 18:34:17
【问题描述】:

我有一个片段,当单击列表中的某个项目时,您可以使用 onListItemClick 确定哪个位置。现在我在每个列表项上都有一个按钮(一个删除按钮),我想知道按下它时单击了哪个位置。我怎样才能做到这一点?似乎按钮的 onClick 方法必须在不同的 Activity 中,所以我不知道如何知道单击了它的哪个位置。这是片段代码:

public class MapListFragment extends ListFragment implements
        LoaderManager.LoaderCallbacks<Cursor> {

    private static final int LOADER_ID = 1;
    private static final String[] FROM = { Database.Maps.DATA,
            Database.Maps.NAME };
    private static final String[] CURSOR_COLUMNS = { Database.Maps.ID,
            Database.Maps.DATA, Database.Maps.NAME };
    private static final int[] TO = { R.id.li_map_image, R.id.li_map_name };

    private SimpleCursorAdapter mAdapter;

    // FIXME isn't this unnecessary?
    public MapListFragment() {
    }

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

        // FIXME reverse the order so the newest sessions are at the top
        mAdapter = new SimpleCursorAdapter(getActivity(),
                R.layout.map_list_item, null, FROM, TO, 0);
        mAdapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() {
            @Override
            public boolean setViewValue(View view, Cursor cursor,
                    int columnIndex) {
                if (view.getId() == R.id.li_map_image) {
                    ((ImageView) view).setImageURI(Uri.parse(cursor
                            .getString(columnIndex)));
                    return true;
                }
                return false;
            }
        });
        setListAdapter(mAdapter);

        getLoaderManager().initLoader(LOADER_ID, null, this);
    }

    @Override
    public void onListItemClick(ListView list, View v, int position, long id) {
        final Intent nextIntent = new Intent(getActivity(),
                ViewMapActivity.class);
        nextIntent.putExtra(Utils.Constants.MAP_ID_EXTRA, id);
        startActivity(nextIntent);
    }


    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle args) {
        return new CursorLoader(getActivity(), DataProvider.MAPS_URI,
                CURSOR_COLUMNS, null, null, null);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        if (loader.getId() == LOADER_ID)
            mAdapter.swapCursor(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
        mAdapter.swapCursor(null);
    }

}

和 XML:

<?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="50dp"
    android:descendantFocusability="blocksDescendants"
    android:orientation="horizontal" >

    <ImageView
        android:id="@+id/li_map_image"
        android:layout_width="50dp"
        android:layout_height="match_parent"
        android:contentDescription="thumbnail" />

    <TextView
        android:id="@+id/li_map_name"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:paddingLeft="8dp"
        android:textSize="16sp" />


    <ImageButton
        android:layout_width="60dp"
        android:layout_height="match_parent"
        android:id="@+id/delete"
        android:focusableInTouchMode="true"
        android:background="@drawable/red_x"
        android:layout_gravity="center|left"
        android:onClick="deleteMap"/>



</LinearLayout>

【问题讨论】:

  • 我认为你做不到。不是你想要的方式。如果您的适配器扩展了 BaseAdapter,那么您可以在 getView 方法中获取位置,但您必须手动进行视图绑定。
  • 您需要覆盖适配器的getView,并将位置设置为按钮上的标签。

标签: java android listview button onclick


【解决方案1】:

您应该能够在 ImageButton 单击处理程序中获取 ImageButton 的父级。假设您在适配器的列表项创建中添加每个按钮侦听器

ImageButton btn_image = (ImageButton) itemview.findViewById(R.id.delete);
btn_image.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        View parentItem = view.getParent();
    }
});

其中 itemview 是列表适配器的 getView 方法中的膨胀视图。

您对简单适配器的需求相当复杂。查看本教程http://www.vogella.com/tutorials/AndroidListView/article.html#adapterown,他将引导您完成制作自己的自定义适配器。您将在自定义列表视图适配器中看到“getView”方法。这是您设置每个列表项并添加按钮的位置。

【讨论】:

  • 已编辑以包含有关如何制作自己的列表适配器的教程链接。
  • 设法让它运行?
【解决方案2】:

首先您可以在列表项中放置一个隐藏字段,以便在您单击时。从视图中您可以找到该字段 (id) 并获取其值。

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 2018-09-10
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多