0

Ich habe eine Recycler-Ansicht, die als implementiert here erweitert wurde. Ich möchte onClickListener für die untergeordneten Elemente der Recycleransicht implementieren, sodass beim Klicken auf das untergeordnete Element eine Toastnachricht mit dem Text angezeigt wird, der in der untergeordneten Textansicht enthalten ist.So implementieren Sie onclicklistener auf erweiterbare recyclerview

public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    final Item item = data.get(position); 
    switch (item.type) { 
     case HEADER: 
      final MyViewHolder itemController = (MyViewHolder) holder; 
      itemController.referalItem = item; 
      itemController.alphabet.setText(item.text.toString()); 
      if (item.invisibleChildren == null) {     itemController.btn_expand_toggle.setImageResource(R.mipmap.knob_add); 
      } else {     itemController.btn_expand_toggle.setImageResource(R.mipmap.knob_remove); 
      } 
      itemController.btn_expand_toggle.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (item.invisibleChildren == null) { 
         item.invisibleChildren = new ArrayList<Item>(); 
         int count = 0; 
         int pos = data.indexOf(itemController.referalItem); 
         while (data.size() > (pos + 1) && data.get(pos + 1).type == CHILD) { 
          item.invisibleChildren.add(data.remove(pos + 1)); 
          count++; 
         } 
         notifyItemRangeRemoved(pos + 1, count); 
         itemController.btn_expand_toggle.setImageResource(R.mipmap.knob_add); 
        } else { 
         int pos = data.indexOf(itemController.referalItem); 
         int index = pos + 1; 
         for (Item i : item.invisibleChildren) { 
          data.add(index, i); 
          index++; 
         } 
         notifyItemRangeInserted(pos + 1, index - pos - 1);       
    itemController.btn_expand_toggle.setImageResource(R.mipmap.knob_remove); 
         item.invisibleChildren = null; 
        } 
       } 
      }); 
      break; 
     case CHILD: 
      final TextView itemTextView = (TextView) holder.itemView; 

      try { 
       itemTextView.setText(data.get(position).text.toString()); 

       itemTextView.setOnClickListener(new View.OnClickListener() { //setting the onclicklistener 
        @Override 
        public void onClick(View v) throws NullPointerException { 
         Toast.makeText(context, itemTextView.getText().toString(), Toast.LENGTH_SHORT).show(); //Gives nullpointer error 
        } 
       }); 
      } catch (NullPointerException e){ 

      } 
break; 

aber ich bekomme Nullpointer wenn ich in der recyclerview.Any Hilfe auf das Kind klicken wird geschätzt. Vielen Dank.

+0

Können Sie zeigen Sie Ihre 'MyViewHolder' Klasse bitte? – kalabalik

Antwort

0

Adaptercode

public class ExpandableListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

//-----add 
interface OnItemClickListener{ 
    void OnItemClick(int position); 
} 
OnItemClickListener onItemClickListener; 
public void setOnItemClickListener(OnItemClickListener onItemClickListener) { 
    this.onItemClickListener = onItemClickListener; 
} 
//------ 

public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) { 
    final Item item = data.get(position); 
    switch (item.type) { 
     case HEADER: 
      final ListHeaderViewHolder itemController = (ListHeaderViewHolder) holder; 
      itemController.refferalItem = item; 
      itemController.header_title.setText(item.text); 
      if (item.invisibleChildren == null) { 
       itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus); 
      } else { 
       itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus); 
      } 
      itemController.btn_expand_toggle.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        if (item.invisibleChildren == null) { 
         item.invisibleChildren = new ArrayList<Item>(); 
         int count = 0; 
         int pos = data.indexOf(itemController.refferalItem); 
         while (data.size() > pos + 1 && data.get(pos + 1).type == CHILD) { 
          item.invisibleChildren.add(data.remove(pos + 1)); 
          count++; 
         } 
         notifyItemRangeRemoved(pos + 1, count); 
         itemController.btn_expand_toggle.setImageResource(R.drawable.circle_plus); 
        } else { 
         int pos = data.indexOf(itemController.refferalItem); 
         int index = pos + 1; 
         for (Item i : item.invisibleChildren) { 
          data.add(index, i); 
          index++; 
         } 
         notifyItemRangeInserted(pos + 1, index - pos - 1); 
         itemController.btn_expand_toggle.setImageResource(R.drawable.circle_minus); 
         item.invisibleChildren = null; 
        } 
       } 
      }); 
      break; 
     case CHILD: 
      TextView itemTextView = (TextView) holder.itemView; 
      itemTextView.setText(data.get(position).text); 
      //-----add 
      itemTextView.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        if(onItemClickListener!=null){ 
         onItemClickListener.OnItemClick(position); 
        } 
       } 
      }); 
      //------ 
      break; 
    } 
} 

Verwendung wie

ExpandableListAdapter adapter = new ExpandableListAdapter(data); 
    recyclerview.setAdapter(adapter); 
    adapter.setOnItemClickListener(new ExpandableListAdapter.OnItemClickListener() { 
     @Override 
     public void OnItemClick(int position) { 
      Toast.makeText(MainActivity.this, data.get(position).text,Toast.LENGTH_SHORT).show(); 
     } 
    }); 
ändern
+0

Danke für. Es funktionierte – John

Verwandte Themen