【问题标题】:Android: How to get the database row id from onItemClickListener when using Custom Adapter?Android:使用自定义适配器时如何从 onItemClickListener 获取数据库行 ID?
【发布时间】:2019-07-13 01:42:17
【问题描述】:

在使用自定义适配器时,我正在尝试从 onItemClickListener 中的列表视图项获取数据库行 ID。

我尝试从 onItemClickListener 内部的“long id”获取 id,但它似乎只返回实际列表中项目的行 id,而不是数据库行 id。

这是我的 onItemClickListener:

 mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {

            String selected = (String) 
mListView.getItemAtPosition(position);
            mTextView = findViewById(R.id.Words);
            mNumberTextView = findViewById(R.id.Number);
            mId = id;
            mAdapterView = adapterView;
            mPositionForRow = position;

            mCopied = 
mHeaderNameTextView.getText().toString();
            mNumberCopied = Integer.toString(mSelected + 1);
            mNumberCopied = 
mNumberTextView.getText().toString();
            mPosition = position + 1;
            mCopiedListItem = mBookCopied + " " + 
mNumberCopied + ":" + mPosition + "\n\n" + selected;

            showMenu(view);
        }
    });

这是我的自定义适配器:

public Adapter(Context context, int resource1, List<String> lines) {
    super(context, resource1, lines);
    this.mContext = context;
    this.mResource1 = resource1;
    this.mLines = lines;

}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull 
ViewGroup parent) {

    View listItem = convertView;
    int pos = position + 1;

    if (listItem == null) {
        listItem = LayoutInflater.from(mContext).inflate(mResource1, 
parent, false);
    }
    mNumberTextView = (TextView) 
listItem.findViewById(R.id.Number);
    mNumberTextView.setText(String.valueOf(pos) + " ");

    mTextView = (TextView) listItem.findViewById(R.id.Words);
    mTextView.setText(mLines.get(position));


    }

    return listItem;
}
}

单击列表项时,会弹出一个菜单。如果用户选择“选择项目”,它应该从项目单击中获取实际的数据库行 ID,但它返回的列表项目编号不是我需要的。在此过程中,我还将 long 转换为 int。我只是没有看到需要包含该方法。

这是菜单选项:

case R.id.select_item:
                    Log.d("TAG", "mId =" + mId);

                mRowPositionInt = (safeLongToInt(mId));
                updateData(1, mRowPositionInt);
                Log.d("TAG", "mRowPosition =" + mRowPositionInt);
                mSharedPreferences.edit().putInt("RowPositionSqlite", 
mRowPositionInt).apply();
                Toast toast2 = Toast.makeText(getApplicationContext(), 
"Select Item Button Clicked!", Toast.LENGTH_SHORT);
                toast2.show();

            }

没有错误消息,它只是不返回实际的数据库行 ID。任何意见将是有益的。我已经通过其他职位,但没有适用于我的情况。感谢您的帮助。

【问题讨论】:

    标签: android sqlite custom-adapter rowid


    【解决方案1】:

    您返回的long id 是您从适配器的getItemId() 返回的时间。

    如果您希望返回数据库行 id 而不仅仅是位置,您需要:

    1. 将数据库行 ID 传递给您的适配器
    2. getItemId() 返回给定位置的正确 ID。

    【讨论】:

    • 谢谢。我会尽力做到这一点并让你知道。感谢您的回复。
    • 伊恩,为了澄清,你能帮我理解一下吗?我仍然需要通过 getView 方法传入的位置。我如何也传递数据库行 ID 并使用 getItemId() 方法来获取它?你能用我提供的代码给我一个例子吗?感谢您的帮助。
    • 您可以完全控制Adapter 类的构造函数,只需传入另一个List&lt;Long&gt; 作为您的数据库ID 列表并使用它来实现您的getItemId()。您对getItemId() 所做的任何事情都不会影响传递给您的方法的position(这就是为什么它被称为position,而不是id
    • 谢谢。我会尝试并告诉你。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多