如何从RecyclerView项目位置获取数据

时间:2018-10-12 02:49:49

标签: firebase android-recyclerview

晚上好。我被困在这个问题上。我正在用Firebase实时数据库中的数据填充RecyclerView。这部分还可以,效果很好。我的疑问是如何在点击事件中从用户那里获得Firebase ID。由于ID未在布局中显示,因此我对如何处理此数据没有任何想法。这里是班级:

适配器

    public class TecnicosAdapter extends RecyclerView.Adapter<TecnicosViewHolders>{

    private List<TecnicosObject> tecnicosList;
    private Context context;




    public TecnicosAdapter (List<TecnicosObject> tecnicosList, Context context){
        this.tecnicosList = tecnicosList;
        this.context = context;

    }

    @NonNull
    @Override
    public TecnicosViewHolders onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {

        View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_tecnicos, null, false);
        RecyclerView.LayoutParams lp = new RecyclerView.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
        layoutView.setLayoutParams(lp);
        TecnicosViewHolders rcv = new TecnicosViewHolders((layoutView));


        return rcv;
    }

    @Override
    public void onBindViewHolder(@NonNull TecnicosViewHolders holder, int position) {
     //   holder.mTecnicoId.setText(tecnicosList.get(position).getUsuarioId());
        holder.mTecnicoNome.setText(tecnicosList.get(position).getNome());
        holder.mTecnicoProfissao.setText(tecnicosList.get(position).getProfissao());

        if (!tecnicosList.get(position).getImagemPerfilUrl().equals("default")){
            Glide.with(context).load(tecnicosList.get(position).getImagemPerfilUrl()).into(holder.mTecnicoImagem);
        }

    }

    public TecnicosObject getItem(int position){
        return tecnicosList.get(position);
    }


    @Override
    public int getItemCount() {
        return this.tecnicosList.size();
    }


}

型号

public class TecnicosObject {
    private String usuarioId;
    private String nome;
    private String profissao;
    private String imagemPerfilUrl;

    public TecnicosObject(String usuarioId, String nome, String profissao, String imagemPerfilUrl) {

        this.usuarioId = usuarioId;
        this.nome = nome;
        this.profissao = profissao;
        this.imagemPerfilUrl = imagemPerfilUrl;

    }

    public String getUsuarioId() {
        return usuarioId;
    }
    public void setUsuarioId(String usuarioId) {
        this.usuarioId = usuarioId;
    }

    public String getNome() {
        return nome;
    }
    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getProfissao() {
        return profissao;
    }
    public void setProfissao(String profissao) {
        this.profissao = profissao;
    }

    public String getImagemPerfilUrl() {
        return imagemPerfilUrl;
    }
    public void setImagemPerfilUrl(String imagemPerfilUrl) {
        this.imagemPerfilUrl = imagemPerfilUrl;
    }
}

ViewHolder

    public class TecnicosViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{


    public TextView mTecnicoNome, mTecnicoProfissao;
    public ImageView mTecnicoImagem;
    private Context context;
    String clienteId;
    private Bundle extras;


    public TecnicosViewHolders(View itemView) {
        super(itemView);
        this.context = context;

        mTecnicoNome = (TextView) itemView.findViewById(R.id.TecnicoNome);
        mTecnicoProfissao = (TextView) itemView.findViewById(R.id.TecnicoProfissao);
        mTecnicoImagem = (ImageView) itemView.findViewById(R.id.TecnicoImagem);


    }


    @Override
    public void onClick(View v) {

        int pos = getAdapterPosition();

        if (pos!=RecyclerView.NO_POSITION){

        }

    }


}

主要活动

public class TelaTecnicos extends AppCompatActivity {

private RecyclerView mRecyclerView;
private RecyclerView.Adapter mTecnicosAdapter;
private RecyclerView.LayoutManager mTecnicosLayoutManager;

private String usuarioAtualID;
private Context context;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.tela_tecnicos);

    getSupportActionBar().setDisplayShowHomeEnabled(true);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    getSupportActionBar().setDisplayShowTitleEnabled(false);

    usuarioAtualID = FirebaseAuth.getInstance().getCurrentUser().getUid();
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    mRecyclerView.setNestedScrollingEnabled(false);
    mRecyclerView.setHasFixedSize(true);
    mTecnicosLayoutManager = new LinearLayoutManager(TelaTecnicos.this);
    mRecyclerView.setLayoutManager(mTecnicosLayoutManager);
    mTecnicosAdapter = new TecnicosAdapter(getDataSetTecnicos(), TelaTecnicos.this);
    mRecyclerView.setAdapter(mTecnicosAdapter);


    getUsuarioTecnicoId();

}

private void getUsuarioTecnicoId() {

    DatabaseReference tecnicoDb = FirebaseDatabase.getInstance().getReference().child("Usuarios").child("Clientes").child(usuarioAtualID).child("conexoes").child("tecnicos");
    tecnicoDb.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                for (DataSnapshot tecnico: dataSnapshot.getChildren()){
                    FetchtecnicoInformation(tecnico.getKey());
                }
            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}

private void FetchtecnicoInformation(final String key) {
    DatabaseReference usuarioDb = FirebaseDatabase.getInstance().getReference().child("Usuarios").child("Tecnicos").child(key);
    usuarioDb.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()){
                String usuarioId = dataSnapshot.getKey();
                String nome = "";
                String profissao = "";
                String imagemPerfilUrl = "";

                if (dataSnapshot.child("nome").getValue()!=null){
                    nome = dataSnapshot.child("nome").getValue().toString();
                }

                if (dataSnapshot.child("profissao").getValue()!=null){
                    profissao = dataSnapshot.child("profissao").getValue().toString();
                }

                if (dataSnapshot.child("imagemPerfilUrl").getValue()!=null){
                    imagemPerfilUrl = dataSnapshot.child("imagemPerfilUrl").getValue().toString();
                }


                TecnicosObject obj = new TecnicosObject(usuarioId, nome, profissao, imagemPerfilUrl);
                resultmTecnicos.add(obj);
                mTecnicosAdapter.notifyDataSetChanged();

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

}


private ArrayList<TecnicosObject> resultmTecnicos = new ArrayList<TecnicosObject>();
private List<TecnicosObject> getDataSetTecnicos() {

    return resultmTecnicos;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if (id == android.R.id.home){
        this.finish();
    }

    return super.onOptionsItemSelected(item);
}

}

有人给小费吗?谢谢。

1 个答案:

答案 0 :(得分:0)

将此内容放入您的ViewHolder onclick()方法technicoId = technicolist.get(pos.getId()) 实现应如下所示->>     `

String technicoId = "";
     @Override
        public void onClick(View v) {

            int pos = getAdapterPosition();

            if (pos!=RecyclerView.NO_POSITION){
               technicoId = technicolist.get(pos).getId();
            }

        }

`

编辑: 如果您的视图持有者位于单独的文件中,则最好在适配器类中实现视图持有者类(这就是我要做的),以便您可以轻松地在视图持有者中引用技术人员列表。看起来像这样

`

     public class TecnicosAdapter extends RecyclerView.Adapter<TecnicosViewHolders>{

        private List<TecnicosObject> tecnicosList;
        ....other methods


        class TecnicosViewHolders extends RecyclerView.ViewHolder implements View.OnClickListener{
     //you can use tecnicolist  here
                @Override
                public void onClick(View v){
                ....
                 }    
  }

}

`