Search code examples
androidlistviewclickcell

Android / JAVA - How to set click function on List view cell


I am trying to add a click function to a programmatically filled List View. I followed a tutorial, and it gives me no errors and to my understanding it should work, however when I tap a cell it does completely nothing. No crash/action occures.

This is my code:

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;


public class domainViewer extends ActionBarActivity {

    public List<Domain> domains = new ArrayList<Domain>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_domain_viewer);

        populateDomainList();
        populateViewList();
        RegisterClickCallback();
    }



    private void populateViewList() {
        ArrayAdapter<Domain> adapter = new MyListAdapter();
        ListView list = (ListView) findViewById(R.id.domainsListView);
        list.setAdapter(adapter);
    }

    private void populateDomainList() {
        domains.add(new Domain("cheese.com", true, "€15,50" , R.drawable.deselected));
        domains.add(new Domain("cheese.nl", true, "€15,50" , R.drawable.deselected));

    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_domain_viewer, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }

    private class MyListAdapter extends ArrayAdapter<Domain> {
        public MyListAdapter() {
            super(domainViewer.this, R.layout.item_view, domains);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View itemView = convertView;
            if (itemView == null) {
                itemView = getLayoutInflater().inflate(R.layout.item_view, parent, false);
            }

            Domain currentDomain = domains.get(position);

            ImageView imageView = (ImageView)itemView.findViewById(R.id.imgSelected);
            imageView.setImageResource(R.drawable.deselected);

            TextView domainText = (TextView) itemView.findViewById(R.id.tvDomain);
            domainText.setText(currentDomain.getDomain());

            TextView priceText = (TextView) itemView.findViewById(R.id.tvPrice);
            priceText.setText(currentDomain.getPrice());

            return itemView;

            //return super.getView(position, convertView, parent);

        }
    }

    private void RegisterClickCallback() {
        ListView list = (ListView) findViewById(R.id.domainsListView);
        list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View viewClicked, int position, long id) {
                Domain clickedDomain = domains.get(position);
                String message = position + " - " + clickedDomain.getDomain();
                Toast toast = Toast.makeText(getApplicationContext(), message, Toast.LENGTH_SHORT);
                toast.show();
            }
        });
    }
}

Solution

  • You need to implement the click event with in your adapter class ,

        public OnItemClickListener onItemClick = new OnItemClickListener() {
    
        @Override
        public void onItemClick(AdapterView<?> arg0, View v, int position,
                long arg3) {
    
        }
    };
    

    Then create the listener where you set the adapter,

        private void populateViewList() {
        ArrayAdapter<Domain> adapter = new MyListAdapter();
        ListView list = (ListView) findViewById(R.id.domainsListView);
        list.setAdapter(adapter);
        list.setOnItemClickListener(adapter.onItemClick);
    }