Search code examples
javaandroidlistviewandroid-studioonclicklistener

Error while applying same onClickListner to all items in custom list view [Android]


I created a custom list view and here is it's code. When I add onClickListener to the view then the toast is only made for ImageView only. When i Try to add same listener to other views(textview) then my app crashes. My custom list view class implements ONClickListener Please help me with this.

@Override
    public View getView(int i, View view, ViewGroup viewGroup) {


        view = layoutInflater.inflate(R.layout.activity_demo6_1, null);

        ImageView img = (ImageView) view.findViewById(R.id.vImage);

        final TextView name = (TextView) view.findViewById(R.id.vName);
        final TextView write = (TextView) view.findViewById(R.id.vWrite);
        final TextView date = (TextView) view.findViewById(R.id.vDate);

        name.setText(articleName[i]);
        write.setText(articleAuthor[i]);
        date.setText(articleDate[i]);

        view.setOnClickListener(this);

        return view;
    }

@Override
    public void onClick(View view) {

    Toast.makeText(context, name1.getText() + "\n" + write1.getText() + "\n" + date1.getText() + "" ,Toast.LENGTH_LONG).show();

    }

Solution

  • I see that you are adding an onClickListener to "view", that should not be the way to add an on click listener to your view items, try this instead

    @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
    
    
            view = layoutInflater.inflate(R.layout.activity_demo6_1, null);
    
            ImageView img = (ImageView) view.findViewById(R.id.vImage);
    
            final TextView name = (TextView) view.findViewById(R.id.vName);
            final TextView write = (TextView) view.findViewById(R.id.vWrite);
            final TextView date = (TextView) view.findViewById(R.id.vDate);
    
            name.setText(articleName[i]);
            write.setText(articleAuthor[i]);
            date.setText(articleDate[i]);
    
            name.setOnClickListener(this);
            write.setOnClickListener(this);
            date.setOnClickListener(this);
    
            return view;
        }
    
    @Override
      public final void onClick(final View v) {
        switch (v.getId()) {
          case R.id.vName:
            nameClick(); // Create corresponding methods for each click, if its the same functionality just use the same method on all switch cases
            break;
          case R.id.vWrite:
            writeClick();
            break;
          case R.id.vDate:
            dateClick();
            break;
          default:
            break;
        }
      }
    
    private void nameClick(){
       Toast.makeText(context, name1.getText() + "\n" + write1.getText() + "\n" + date1.getText() + "" ,Toast.LENGTH_LONG).show();
    }
    

    Hope it helps