简体   繁体   中英

Why are my Items in ListView not Clickable?

Items on my list view are not clickable I have tried to getcurrentfocus() and blocking descendants in RelativeLayout tag in content_palce.xml. All I want from the list is two functions:

  1. When I click the item another activity is started.
  2. When a long press happens a context menu is shown.

PlaceActiviy.java

        package abdualla.com.covuninavigator;


import android.annotation.TargetApi;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.ListActivity;
import android.content.Context;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Build;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.NavigationView;
import android.support.design.widget.Snackbar;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.util.Log;
import android.view.ContextMenu;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.EditText;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;

import com.google.android.gms.appindexing.Action;
import com.google.android.gms.appindexing.AppIndex;
import com.google.android.gms.common.api.GoogleApiClient;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;

//Places List
public class PlaceActivity extends AppCompatActivity implements NavigationView.OnNavigationItemSelectedListener {
    DBHelper db = new DBHelper(this);
    ListView placeslist;
    EditText seachbar;
    static ListAdapter listAdapter;
    static ArrayList<Place> list;
    /**
     * ATTENTION: This was auto-generated to implement the App Indexing API.
     * See https://g.co/AppIndexing/AndroidStudio for more information.
     */
    private GoogleApiClient client;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        //Un Comment to Build Database for First time run
//        db.insertPlace("Alan Berry", "Coventry, West Midlands CV1 5FB", "52.407981", "-1.505527");
//        db.insertPlace("Coventry Un*iversity College", "113A Gosftord Street Coventry CV15FB", "52.407439", "-1.500221");
//        db.insertPlace("Bugatti", "Cox Street Coventry CV1 5FB", "52.407479", "-1.503390");
//        db.insertPlace("Charles Ward", "Cox Street Coventry CV1 5FB", "52.408623", "-1.504856");
//        db.insertPlace("Engineering & Computing Building", "Gulson Rd, Coventry, West Midlands CV1 2JH", "52.405607", "-1.499454");
//        db.insertPlace("Ellen Terry", "Jordan Well,Coventry CV1 5RW", "52.406883", "-1.504703");
//        db.insertPlace("Frederick Lanchester Library", "Frederick Lanchester Building, Coventry University, Coventry, West Midlands CV1 5DD", "52.406056", "-1.500545");
//        db.insertPlace("George Elliot", "Coventry CV15LW", "52.408217", "-1.504890");
//        db.insertPlace("Graham Sutherland", "Gosford Street, Coventry CV1", "52.407212", "-1.502934");
//        db.insertPlace("The Hub", "Gosford Street, Coventry, West Midlands CV1 5QP", "52.407741", "-1.504792");
//        db.insertPlace("Jaguar Building", "Gosford Street, Coventry, West Midlands CV1 5PJ", "52.407450", "-1.500545");
//        db.insertPlace("James Starley", "Cox Street, Coventry, West Midlands CV1 5PH", "52.407892", "-1.504065");
//        db.insertPlace("Maurice Foss", "Maurice Foss Building, Coventry, West Midlands CV1 5PH", "52.408047", "-1.503346");
//        db.insertPlace("Multi-Storey Car Park", "Gosford St, Coventry, West Midlands CV1 5DD", "52.406288", "-1.499699");
//        db.insertPlace("Priory Building", "Priory Street, Coventry", "52.407351", "-1.503692");
//        db.insertPlace("Richard Crossman", "Much Park Street,Coventry, West Midlands CV1HF", "52.406666", "-1.505438");
//        db.insertPlace("Sir John Laing Building", "Much Park Street,Coventry, West Midlands CV1HF", "52.405879", "-1.505003");
//        db.insertPlace("Sir William Lyons", "Gosford Street, Coventry CV1", "52.407476", "-1.499722");
//        db.insertPlace("Student Centre", "Gulson Rd, Coventry, West Midlands CV1 2JH", "52.404984", "-1.500694");
//        db.insertPlace("Whitefriars", "Coventry CV1 2DS", "52.405255", "-1.501582");
//        db.insertPlace("William Morris", "Cox Street, Coventry, West Midlands CV1 5PH", "52.407892", "-1.504065");
//        db.insertPlace("Sports Centre", "Whitefriars Lane, Coventry, West Midlands CV1 2DS", "52.405973", "-1.504225");
//        db.insertPlace("Coventry City Council", "Earl Street, Coventry, West Midlands CV1 5RR", "52.407355", "-1.508035");
        //Un Comment to Build Database for First time run

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_place);

        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                FragmentManager fm = getFragmentManager();
                AddPlaceFragement addPlaceFragement = new AddPlaceFragement();
                addPlaceFragement.show(fm, "Add Place");
            }
        });

//        DrawerLayout drawer = (DrawerLayout) findViewById(R.id.drawer_layout);
//        ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(
//                this, drawer, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close);
//        drawer.setDrawerListener(toggle);
//        toggle.syncState();
//
//        NavigationView navigationView = (NavigationView) findViewById(R.id.nav_view);
//        navigationView.setNavigationItemSelectedListener(this);
//      db.deleteAll();


        placeslist = (ListView) findViewById(R.id.list);
        seachbar = (EditText) findViewById(R.id.searchplaces);
        list = db.getAllplaces();
        listAdapter = new ListAdapter(this, list, getResources());
        placeslist.setAdapter(listAdapter);

        placeslist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(getApplicationContext(), "Position is:" + position, Toast.LENGTH_LONG);
            }
        });

        if(placeslist.isClickable()){
            Log.v("Clickable is ","Yes");
        }
        seachbar.addTextChangedListener(new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {

            }

            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                listAdapter.getFilter().filter(s.toString());
            }

            @Override
            public void afterTextChanged(Editable s) {

            }
        });

        registerForContextMenu(placeslist);
        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();
    }

    @Override
    public boolean onNavigationItemSelected(MenuItem item) {
        return false;
    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        menu.setHeaderTitle("Select an Option");
        menu.add(0, v.getId(), 0, "Show on Map");
        menu.add(0, v.getId(), 0, "Delete");
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)item.getMenuInfo();

        //  info.position will give the index of selected item
        int IndexSelected=info.position;

        if(item.getTitle()=="Delete"){
            list.remove(IndexSelected);
            listAdapter.notifyDataSetChanged();
        }
        else if (item.getTitle()=="Show on Map"){
            Toast.makeText(getApplicationContext(),"Lat is:"+list.get(IndexSelected).getLat()+"lng is: "+list.get(IndexSelected).getLng(),Toast.LENGTH_LONG);
        }
        return super.onContextItemSelected(item);

    }

    @Override
    public void onStart() {
        super.onStart();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        client.connect();
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Place Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app deep link URI is correct.
                Uri.parse("android-app://abdualla.com.covuninavigator/http/host/path")
        );
        AppIndex.AppIndexApi.start(client, viewAction);
    }

    @Override
    public void onStop() {
        super.onStop();

        // ATTENTION: This was auto-generated to implement the App Indexing API.
        // See https://g.co/AppIndexing/AndroidStudio for more information.
        Action viewAction = Action.newAction(
                Action.TYPE_VIEW, // TODO: choose an action type.
                "Place Page", // TODO: Define a title for the content shown.
                // TODO: If you have web page content that matches this app activity's content,
                // make sure this auto-generated web page URL is correct.
                // Otherwise, set the URL to null.
                Uri.parse("http://host/path"),
                // TODO: Make sure this auto-generated app deep link URI is correct.
                Uri.parse("android-app://abdualla.com.covuninavigator/http/host/path")
        );
        AppIndex.AppIndexApi.end(client, viewAction);
        client.disconnect();
    }
}

activity_place.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:context="abdualla.com.covuninavigator.PlaceActivity">

    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="?attr/colorPrimary"
            app:popupTheme="@style/AppTheme.PopupOverlay"
            android:title="Places List"/>

    </android.support.design.widget.AppBarLayout>

    <include layout="@layout/content_place" />

    <android.support.design.widget.FloatingActionButton
        android:id="@+id/fab"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="bottom|end"
        android:layout_margin="@dimen/fab_margin"
        android:src="@android:drawable/ic_input_add" />

</android.support.design.widget.CoordinatorLayout>

content_place.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="horizontal">
    <ListView xmlns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/list"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@+id/searchplaces"
        />
    <android.support.design.widget.AppBarLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:theme="@style/AppTheme.AppBarOverlay"
        android:id="@+id/view" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/searchplaces"
        android:layout_marginTop="47dp"
        android:layout_below="@+id/view"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true" />

</RelativeLayout>

ListAdapter.java

package abdualla.com.covuninavigator;

import android.app.Activity;
import android.content.Context;
import android.content.DialogInterface;
import android.content.res.Resources;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

/**
 * Created by amr on 28/12/15.
 */
public class ListAdapter extends BaseAdapter implements DialogInterface.OnClickListener, Filterable {
    private Activity activity;
    private ArrayList data;
    private static LayoutInflater inflater=null;
    public Resources res;
    Place tempValues=null;
    int i=0;
    private ArrayList<Place> mOriginalValues;
    private ArrayList<Place> mDisplayedValues;

    public ListAdapter(Activity a, ArrayList d,Resources resLocal){
        this.activity=a;
        this.data=d;
        this.res=resLocal;
        this.mOriginalValues = d;
        this.mDisplayedValues = d;
        inflater=(LayoutInflater)activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public int getCount() {
        if(data.size()<=0)
            return 1;
        return data.size();
    }

    @Override
    public Object getItem(int position) {
        return position;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }



    @Override
    public Filter getFilter() {

        Filter filter = new Filter() {

            @SuppressWarnings("unchecked")
            @Override
            protected void publishResults(CharSequence constraint,FilterResults results) {

                data = (ArrayList<Place>) results.values; // has the filtered values
                notifyDataSetChanged();  // notifies the data with new filtered values
            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults results = new FilterResults();        // Holds the results of a filtering operation in values
                ArrayList<Place> FilteredArrList = new ArrayList<Place>();

                if (mOriginalValues == null) {
                    mOriginalValues = new ArrayList<Place>(mDisplayedValues); // saves the original data in mOriginalValues
                }

                /********
                 *
                 *  If constraint(CharSequence that is received) is null returns the mOriginalValues(Original) values
                 *  else does the Filtering and returns FilteredArrList(Filtered)
                 *
                 ********/
                if (constraint == null || constraint.length() == 0) {

                    // set the Original result to return
                    results.count = mOriginalValues.size();
                    results.values = mOriginalValues;
                } else {
                    constraint = constraint.toString().toLowerCase();
                    for (int i = 0; i < mOriginalValues.size(); i++) {
                        String data = mOriginalValues.get(i).name;
                        if (data.toLowerCase().startsWith(constraint.toString())) {
                            FilteredArrList.add(new Place(mOriginalValues.get(i).getName(),mOriginalValues.get(i).getAddress(),mOriginalValues.get(i).getLat(),mOriginalValues.get(i).getLng()));
                        }
                    }
                    // set the Filtered result to return
                    results.count = FilteredArrList.size();
                    results.values = FilteredArrList;
                }
                return results;
            }
        };
        return filter;
    }


    public static class ViewHolder{

        public TextView name;
        public TextView address;

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        ViewHolder holder;
        if(convertView==null){
            vi=inflater.inflate(R.layout.place_list_item,null);
            holder=new ViewHolder();
            holder.name=(TextView)vi.findViewById(R.id.placename);
            holder.address=(TextView)vi.findViewById(R.id.address);

            vi.setTag(holder);
        }
        else
            holder=(ViewHolder)vi.getTag();
        if(data.size()<=0)
        {
            holder.name.setText("No Places Found");
            holder.address.setText("");

        }
        else{
            tempValues=(Place)data.get(position);
            holder.name.setText(tempValues.getName());
            holder.address.setText(tempValues.getAddress());


        }
        vi.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

            }
        });
        return vi;
    }


    @Override
    public void onClick(DialogInterface dialog, int which) {

    }
}

Update 1:

I did add onitemclick listener but.. it didn't work. The list can be scrolled but cannot be clicked. When you click a listview is shows feedback.. If you have a clicklistener something will happen....if you don't nothing will happen but it will detect the click anyway.. That's not happening in my case. It seems thr click is not detected.

Add this code then its working.

      placeslist .setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {

                }
            });

add

placeslist.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            }
        });

your placeslist is missing an onItemClickListener ! And you can setOnClickListener to your item if it has Button or others.

1.When I click the item another activity is started.

To do so, just after placeslist.setAdapter(listAdapter); add the following code:

  placeslist .setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        switch (position) {
            case 0:
                Intent i = new Intent(getApplicationContext(), YourNewActivty.class);
                startActivity(i);
                break;
        }
        }
        });

2. When a long press happens a context menu is shown.

Check this

Android doesn't allow to select list items that have focusable elements in Item's layout .

disable focusable in your Layout's items

android:focusable="false"

add the code you want to execute on click inside click listener inside getView

public View getView(int position, View convertView, ViewGroup parent) {

View vi = convertView;

vi.setOnClickListener(new View.OnClickListener() {

 @Override
public void onClick(View v) {
    Toast.makeText(getApplicationContext(), "Position is:" + position, Toast.LENGTH_LONG);
        }
    });
    return vi;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM