我正在创建一个回收者视图,在其中,我得到的调查名称是Firebase数据库中调查参考编号的子代。我想要的是,当用户在recyclerview列表中单击调查名称时,它将获得父键值(即调查参考编号)。我已附上数据库的图像。在点击调查名称用蓝色线圈起来时,我希望父键用黄色线阴影
我在适配器类中使用了一个接口,在那里我要获取位置和modelResponse
var Tx = require('ethereumjs-tx').Transaction
const Web3 = require('web3');
const provider = new Web3.providers.HttpProvider("https://ropsten.infura.io/v3/7fb0bdc97c.....");
const web3 = new Web3(provider);
var contract1 = new web3.eth.Contract(contractABI, contractAddress1)
const txData2 = contract1.methods.setTotalSupply(10).encodeABI();
setSupplyBalance(contractAddress1, txData2);
function setSupplyBalance(contractAddress, txData ){
web3.eth.getTransactionCount(account1, (err, txCount) => {
txObject = {
nonce: web3.utils.toHex(txCount),
gasLimit: web3.utils.toHex(1000000),
gasPrice: web3.utils.toHex(web3.utils.toWei('100', 'gwei')),
to: contractAddress,
value: web3.utils.toHex(web3.utils.toWei('0', 'ether')),
data:txData
}
const tx = new Tx(txObject, {chain:'ropsten', hardfork: 'petersburg'})
// sign the trx
tx.sign(privateKey1)
serializedTx = tx.serialize()
raw = '0x' + serializedTx.toString('hex')
web3.eth.sendSignedTransaction (raw, (err, txHash)=> {
console.log('err:', err)
console.log('txHash', txHash)
})
})
}
然后在Activity Iam中获得它
public SurveysListAdapter(List<SurveysListModel> modelList, Context context, HandleClickListener handleClickListener)
{
this.modelList = modelList;
this.context = context;
this.handleClickListener = handleClickListener;
}
@Override
public void onBindViewHolder(@NonNull final SurveyListViewHolder holder, final int position) {
final SurveysListModel response = modelList.get(position);
holder.questions.setText(response.getSurvey_name());
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
handleClickListener.onItemClicked(position, modelList.get(position));
}
});
}
public interface HandleClickListener {
void onItemClicked(int position, SurveysListModel surveysListModel);
}
答案 0 :(得分:2)
要允许此操作,您需要做两件事:
parentSnap.getKey()
值可用于适配器,就像您对parentSnap.getValue(...)
对象所做的一样。要使密钥可用,您再次有两个选择:
为此键的一个字段添加到您的SurveysListModel
类中,然后在获取值之后进行设置。
除了现有的List<String> keyList
之外,还要维护一个单独的List<SurveysListModel> modelList
,并将两者都传递给适配器的构造函数。
对于这两种情况,代码看起来都是相似的,所以我只着重于如何获取密钥,然后例如将其传递给``对象(上面的#1):
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for (final DataSnapshot parentSnap : dataSnapshot.getChildren()) {
progressDialog.dismiss();
SurveysListModel model = parentSnap.getValue(SurveysListModel.class);
model.key = parentSnap.getKey();
list.add(model);
}
adapter = new SurveysListAdapter(list, UserAllSurveys.this, new SurveysListAdapter.HandleClickListener() {
@Override
public void onItemClicked(int position, SurveysListModel surveysListModel) {
String typ = surveysListModel.getSurvey_name();
String key = surveysListModel.key;
Toast.makeText(UserAllSurveys.this, "CLicked " + key, Toast.LENGTH_SHORT).show();
}
});
recyclerView.setAdapter(adapter);
我在这里所做的更改:
if (parentSnap.exists()) {
,因为在getChildren()
上的循环中无法做到这一点。将密钥传递到model.key = parentSnap.getKey();
。您将必须将此key
字段添加到您的类中,并可能将其标记为@Exclude
,以确保它不会被写入数据库:
@Exclude
String key;
将整个adapter = new SurveysListAdapter
块移到getChildren()
循环之外,我认为这是您原始代码中的复制/粘贴错误。
当用户单击项目时,使用String key = surveysListModel.key;
从对象读取它们的键。