У меня есть один фрагмент Android, у которого есть listView. Теперь я хочу реализовать onItemClickListener и показать модальное окно, если пользователь щелкнет один элемент ListView. Затем, если я нажму на один элемент, я должен увидеть модальное окно с другим listView. Итак, с моим кодом, если я попытаюсь щелкнуть один элемент, я могу отобразить элементы последнего элемента моего основного listView, и это нехорошо.

Это мой фрагмент:

public class AlertsFragment extends Fragment {

    private AlertAdapter pAdapter;
    AlertXAgentAdapter agentAdapter;
    AlertXReactionAdapter reactionAdapter;
    private RecyclerView recyclerView,recyclerAgentView,recyclerReactionView;

    private List<Alert> lista= new ArrayList<Alert>();
    View v;
    ExpandableListView expandableListView;
    ExpandableListAdapter expandableListAdapter;
    private static final int ARG_SECTION_NUMBER =6;

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        ((AndroidNavDrawerActivity) context).onSectionAttached(
                ARG_SECTION_NUMBER);
    }
    public View onCreateView(LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        v=inflater.inflate(R.layout.alerts_activity, container, false);
        recyclerView = (RecyclerView) v.findViewById(R.id.recycler_view);

        //recupero la lista delle medication
        AlertDAO manager = new AlertDAO(this.getContext());

        lista = manager.getAlerts();

        pAdapter = new AlertAdapter(lista, new AlertAdapter.OnItemClickListener() {
            @Override
            public void onItemClick(Alert item) {
                try{
                    final Dialog dialog = new Dialog(v.getContext());

                    LayoutInflater inflater = LayoutInflater.from(v.getContext());
                    View dialogView = inflater.inflate(R.layout.alert_agent_reaction_modal, null);
                    //agent
                    recyclerAgentView = (RecyclerView) dialogView.findViewById(R.id.recycler_agent_view);
                    //reaction
                    recyclerReactionView = (RecyclerView) dialogView.findViewById(R.id.recycler_reaction_view);
                    dialog.setContentView(dialogView);
                    dialog.setTitle("Agent and Reaction");

                    //agent
                    agentAdapter = new AlertXAgentAdapter(item.getListaAgent());
                    //reaction
                    reactionAdapter = new AlertXReactionAdapter(item.getListaReaction());

                    RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(v.getContext());
                    recyclerAgentView.setLayoutManager(mLayoutManager);
                    recyclerAgentView.setItemAnimator(new DefaultItemAnimator());
                    recyclerAgentView.setAdapter(agentAdapter);

                    RecyclerView.LayoutManager mLayoutManager2 = new LinearLayoutManager(v.getContext());
                    recyclerReactionView.setLayoutManager(mLayoutManager2);
                    recyclerReactionView.setItemAnimator(new DefaultItemAnimator());
                    recyclerReactionView.setAdapter(reactionAdapter);

                   dialog.show();
                }catch(Exception e){
                    Log.e("","");
                }
            }
        });
        RecyclerView.LayoutManager mLayoutManager = new LinearLayoutManager(v.getContext());
        recyclerView.setLayoutManager(mLayoutManager);
        recyclerView.setItemAnimator(new DefaultItemAnimator());
        recyclerView.setAdapter(pAdapter);

        /**
         * Inflate the layout for this fragment
         */
        return v;
    }
}

Это мой адаптер

public class AlertAdapter extends RecyclerView.Adapter<AlertAdapter.MyViewHolder> {

    private List<Alert> list;
    public Alert alert;
    public OnItemClickListener listener;

    public interface OnItemClickListener {
        void onItemClick(Alert item);
    }

    public class MyViewHolder extends RecyclerView.ViewHolder  implements View.OnClickListener  {
        public TextView startDate, endDate,description,status;

        public MyViewHolder(View view) {
            super(view);
            startDate = (TextView) view.findViewById(R.id.startDate);
            endDate = (TextView) view.findViewById(R.id.endDate);
            description = (TextView) view.findViewById(R.id.description);
            status = (TextView) view.findViewById(R.id.status);
            view.setOnClickListener(this);
        }

        @Override
        public void onClick(View v) {
            if(listener != null){
                listener.onItemClick(alert);
            }
        }
    }


    public AlertAdapter(List<Alert> list,OnItemClickListener listener) {
        this.list = list;
        this.listener=listener;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View itemView = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.alert_list_row, parent, false);

        return new MyViewHolder(itemView);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        alert = list.get(position);
        holder.startDate.setText(alert.getDateStart()!=null ? alert.getDateStart() : "");
        holder.endDate.setText(alert.getDateEnd()!=null ? alert.getDateEnd() : "");
        holder.description.setText(alert.getAlertInfo().getDisplayName());
        //holder.type.setText(planOfCare.getDateEnd()!=null ? planOfCare.getDateEnd() : "");
        holder.status.setText(alert.getAlarmAlertInfo().getDisplayName());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }
}
0
bircastri 11 Май 2016 в 15:02

2 ответа

Лучший ответ

Ваша переменная Alert не назначается надлежащему объекту, поскольку вы назначаете ее в методе onBindViewHolder. В методе onclick вашего ViewHolder попробуйте использовать это вместо передачи переменной Alert

listener.onItemClick(list.get(this.getAdapterPosition()));
1
Bhushan 11 Май 2016 в 12:32

Я думаю, вы должны сделать что-то вроде этого

public class AlertsFragment extends Fragment implements OnClickListener {

personRewardAdapter =new PersonRewardAdapter(PersonRewardSelectionActivity.this, Utilities.R_entities);
                rewardList.setAdapter(personRewardAdapter);
rewardList.setOnclickListener(getActivity());
}
public void OnClick(){


}

Сделайте это в onCreateView. Я делаю это в своем коде и, возможно, это вам поможет, поэтому я делюсь с вами

0
Junaid 11 Май 2016 в 12:21