【问题标题】:How can I implements OnItemClickListener on ListView如何在 ListView 上实现 OnItemClickListener
【发布时间】:2016-05-11 12:02:27
【问题描述】:

我有一个具有 listView 的 android 片段。现在,如果用户单击 ListView 的一项,我想实现 onItemClickListener 并显示一个模态。然后,如果我单击一个项目,我应该会看到一个带有另一个 listView 的 Modal。所以用我的代码,如果我尝试点击一个项目,我可以显示我的主体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();
    }
}

【问题讨论】:

  • 如果您阅读了我的代码,我只是这样做了,但不起作用
  • 放置调试点或日志语句来检查代码是否正在执行
  • 在我的片段类中,在方法 OnClick 中,项目 Alert 每次都是我列表的最后一个元素。如果我的列表有 10 个元素并且我单击第二个元素,则警报是我列表的最后一个元素 (10)。
  • 有任何解决方案对您有用吗?

标签: android listview android-fragments


【解决方案1】:

您的 Alert 变量没有被分配给正确的对象,因为您在 onBindViewHolder 方法中分配它。在您的 ViewHolder 的 onclick 方法中尝试使用它而不是传递 Alert 变量

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

【讨论】:

    【解决方案2】:

    我认为你应该这样做

    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 中执行此操作。我在我的代码中这样做,也许它可以帮助你,所以我分享给你

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多