从firebase数据库中获取recyclerview中子项的单击的父键值

时间:2019-11-06 13:33:10

标签: android firebase-realtime-database android-recyclerview

我正在创建一个回收者视图,在其中,我得到的调查名称是Firebase数据库中调查参考编号的子代。我想要的是,当用户在recyclerview列表中单击调查名称时,它将获得父键值(即调查参考编号)。我已附上数据库的图像。在点击调查名称用蓝色线圈起来时,我希望父键用黄色线阴影

enter image description here

我在适配器类中使用了一个接口,在那里我要获取位置和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);
    }

1 个答案:

答案 0 :(得分:2)

要允许此操作,您需要做两件事:

  1. 使parentSnap.getKey()值可用于适配器,就像您对parentSnap.getValue(...)对象所做的一样。
  2. 通常通过按位置查找来查找用户单击的值的正确键。

要使密钥可用,您再次有两个选择:

  1. 为此键的一个字段添加到您的SurveysListModel类中,然后在获取值之后进行设置。

  2. 除了现有的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);

我在这里所做的更改:

  1. 删除if (parentSnap.exists()) {,因为在getChildren()上的循环中无法做到这一点。
  2. 将密钥传递到model.key = parentSnap.getKey();。您将必须将此key字段添加到您的类中,并可能将其标记为@Exclude,以确保它不会被写入数据库:

    @Exclude 
    String key;
    
  3. 将整个adapter = new SurveysListAdapter块移到getChildren()循环之外,我认为这是您原始代码中的复制/粘贴错误。

  4. 当用户单击项目时,使用String key = surveysListModel.key;从对象读取它们的键。