首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >实现对已分组到hashmap中的recycleviwer项的单击?

实现对已分组到hashmap中的recycleviwer项的单击?
EN

Stack Overflow用户
提问于 2018-06-08 03:14:44
回答 1查看 19关注 0票数 0

我有一个按日期分组的列表,在这样做之后,将被发送到适配器,以便组装布局。列表代码:

代码语言:javascript
复制
agendamentoVos = (ArrayList<AgendamentoVo>) ((RetornoFilaAtendimento) asyncTaskResult.getResult()).getRetorno();
            HashMap<Date, List<AgendamentoVo>> groupedHashMap = groupDataIntoHashMap(agendamentoVos);

            for (Date date : groupedHashMap.keySet()) {
                DateItem dateItem = new DateItem();
                String date1 = "";
                try {
                    date1 = UtilDateFormat.formatDateToStringAnoMesDia(date);
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                dateItem.setDate(date1);
                listItem.add(dateItem);

                for (AgendamentoVo pojoOfJsonArray : groupedHashMap.get(date)) {
                    GeneralItem generalItem = new GeneralItem();
                    generalItem.setAgendamentoVoGeneral(pojoOfJsonArray);//setBookingDataTabs(bookingDataTabs);
                    listItem.add(generalItem);
                }
            }

这里是分组方法:

代码语言:javascript
复制
private HashMap<Date, List<AgendamentoVo>> groupDataIntoHashMap(List<AgendamentoVo> agendamentoVoList) {

    HashMap<Date, List<AgendamentoVo>> groupedHashMap = new HashMap<>();

    for (AgendamentoVo agendamentoVo : agendamentoVoList) {

        Date hashMapKey = UtilDateFormat.removeHora(agendamentoVo.getItemAgenda().getDtConsulta());// dd/MM/yyyy

        if (groupedHashMap.containsKey(hashMapKey)) {
            // The key is already in the HashMap; add the pojo object
            // against the existing key.
            groupedHashMap.get(hashMapKey).add(agendamentoVo);
        } else {
            // The key is not there in the HashMap; create a new key-value pair
            List<AgendamentoVo> list = new ArrayList<>();
            list.add(agendamentoVo);
            groupedHashMap.put(hashMapKey, list);
        }
    }

    return groupedHashMap;
}

将分组的内容发送到适配器:

代码语言:javascript
复制
mAdapter = new CustomRecyclerViewAdapterFila(listItem, this, this, new CustomItemClickListener() {
                        @Override
                        public void onItemClick(View v, int position) {
                            itemclick(position);
                        }
                    });
                    // use this setting to improve performance if you know that changes
                    // in content do not change the layout size of the RecyclerView
                    LinearLayoutManager layoutManager = new LinearLayoutManager(this);
                    layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
                    //mRecyclerView.setHasFixedSize(true);
                    // use a linear layout manager
                    mRecyclerView.setLayoutManager(layoutManager);
                    mRecyclerView.setAdapter(mAdapter);

在适配器中,如图所示挂载分组布局:

然后,适配器阵列的大小为5,卡在位置1、2和4。然后,对于点击,例如,如果点击了第三张卡,即位置4,则中断。

错误:

代码语言:javascript
复制
at br.com.sisteplan.evida.atendimento.activities.FilaActivity.itemclick(FilaActivity.java:310)
                                                                                    at br.com.sisteplan.evida.atendimento.activities.FilaActivity.access$500(FilaActivity.java:46)
                                                                                    at br.com.sisteplan.evida.atendimento.activities.FilaActivity$4.onItemClick(FilaActivity.java:291)
                                                                                    at br.com.sisteplan.evida.atendimento.adapters.CustomRecyclerViewAdapterFila$1.onClick(CustomRecyclerViewAdapterFila.java:110)

适配器:

代码语言:javascript
复制
private CustomItemClickListener listener;
@NonNull
    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(
            @NonNull ViewGroup parent, int viewType) {

        RecyclerView.ViewHolder viewHolder = null;
        LayoutInflater inflater = LayoutInflater.from(parent.getContext());

        switch (viewType) {

            case ListItem.TYPE_GENERAL:
                View v1 = inflater.inflate(R.layout.cell_item_fila, parent,
                        false);
                viewHolder = new GeneralViewHolder(v1);
                break;

            case ListItem.TYPE_DATE:
                View v2 = inflater.inflate(R.layout.cell_item_date_fila, parent, false);
                viewHolder = new DateViewHolder(v2);
                break;

        }

        return viewHolder;
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, final int position) {

        switch (viewHolder.getItemViewType()) {

            case ListItem.TYPE_GENERAL:
                final GeneralItem generalItem = (GeneralItem) mDataset.get(position);
                final GeneralViewHolder generalViewHolder= (GeneralViewHolder) viewHolder;
                generalViewHolder.txtTitle.setText(generalItem.getAgendamentoVoGeneral().getPaciente().getNmPaciente());
                generalViewHolder.linearLayoutCard.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onItemClick(view, generalViewHolder.getAdapterPosition());
                }
            });
                break;

            case ListItem.TYPE_DATE:

                DateItem dateItem = (DateItem) mDataset.get(position);
                DateViewHolder dateViewHolder = (DateViewHolder) viewHolder;
                dateViewHolder.txtTitle.setText(dateItem.getDate());
                // Populate date item data here
                break;
        }
    }

ItemClick:

代码语言:javascript
复制
private void itemclick(int position) {
    Intent it = new Intent(this, AtendimentoPacienteActivity.class);
    Bundle bundle = new Bundle();
    //CRASH CRASH!!!
    pacienteVo = agendamentoVos.get(position).getPaciente(); //CRASH CRASH!!!
    consultaVo.setDtInicio(UtilDateFormat.dataCorrente());
    consultaVo.setAgendamento(agendamentoVos.get(position));
    bundle.putSerializable(getString(R.string.argument_paciente), pacienteVo);
    bundle.putSerializable(getString(R.string.consulta_bundle), consultaVo);
    it.putExtras(bundle);
    startActivity(it);
}

如何实现点击项目?谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-08 03:42:59

由于您的项目列表很复杂,因此很难处理基于位置的单击,但您始终可以使用视图设置标签,在onClick方法中,您可以使用getTag()方法获取项目并对项目执行所需的操作。

代码语言:javascript
复制
generalViewHolder.linearLayoutCard.setTag(generalItem);
generalViewHolder.linearLayoutCard.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    listener.onItemClick(view,(GeneralItem)v.getTag());
                }
            });

定义:

代码语言:javascript
复制
private void onItemClick(View v, GeneralItem generalItem) {
    //do your handling based on generalItem object
}

或者,您也可以将项目在列表中的实际位置设置为标签值,而不是完整项目。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50748680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档