2016-05-11 79 views
0

我有一個具有listView的android片段。現在我想實現onItemClickListener並顯示一個Modal,如果用戶點擊一個ListView項。然後,如果我點擊一個項目,我應該看到另一個listView的Modal。因此,用我的代碼,如果我嘗試點擊一個項目,我可以顯示我的主要listView的最後一個元素的項目,這是不好的。我如何在ListView上實現OnItemClickListener

這是我的片段:

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

請參閱[Recyclerview click listener](http://stackoverflow.com/questions/36759744/onclicklistener-on-the-specific-item -of-the-recyclerview-in-android/36759897#36759897) – Bhushan

+0

如果您閱讀我的代碼,我只是這樣做,但不能工作 – bircastri

+0

將調試點或日誌語句檢查代碼是否正在執行 – Bhushan

回答

1

Alert變量沒有得到分配給合適的對象,你在onBindViewHolder方法分配它。在你ViewHolder的onclick方法嘗試使用這個,而不是傳遞Alert變量

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

我認爲你應該做這樣的事情

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做到這一點。我在我的代碼中這樣做,也許它可以幫助你,所以我分享給你

相關問題