Why are my items in the ListView not accessible?

Elements in my list do not change. I tried getcurrentfocus () and blocked the descendants in the RelativeLayout tag in content_palce.xml. All I want from the list consists of two functions:

  • When I click an item, another action is triggered.
  • A long press displays a context menu.

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 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 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 added an onitemclick listener, but .. this did not work. The list can be scrolled, but not clicked. When you click on the list, feedback will be shown. If you have a clicker, something will happen ... if you do nothing, but it still detects a click. This does not happen in my case. It seems tg click was not detected.

+4
6

, .

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

                }
            });
+1

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

            }
        });
+1

onItemClickListener! OnClickListener , .

0

1. , .

, placeslist.setAdapter(listAdapter); :

  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. .

0

Android does not allow you to select list items that have focusable items in the Item layout.

disable focus in layout elements

Android: focus = false

0
source

add the code you want to execute by clicking inside the click listen button 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;
}
0
source

Source: https://habr.com/ru/post/1622426/


All Articles