如何在ListView上实现OnItemClickListener

时间:2016-05-11 12:02:27

标签: android listview android-fragments

我有一个有listView的android片段。现在我想要实现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();
    }
}

2 个答案:

答案 0 :(得分:1)

当您使用Alert方法分配时,onBindViewHolder变量未分配给正确的对象。在ViewHolder的onclick方法中尝试使用此方法而不是传递Alert变量

listener.onItemClick(list.get(this.getAdapterPosition()));

答案 1 :(得分:0)

我认为你应该做这样的事情

&#13;
&#13;
public class AlertsFragment extends Fragment implements OnClickListener {

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


}
&#13;
&#13;
&#13;

在onCreateView中执行此操作。我在我的代码中这样做,也许它可以帮助你,所以我分享给你