简体   繁体   English

为什么ListView中的项目不可点击?

[英]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. 列表视图中的项目不可点击我尝试使用getcurrentfocus()并在content_palce.xml中的RelativeLayout标记中阻止后代。 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 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 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 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 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: 更新1:

I did add onitemclick listener but.. it didn't work. 我确实添加了onitemclick监听器,但它没有用。 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. 单击列表视图时会显示反馈..如果你有一个clicklistener会发生一些事情....如果你不会发生任何事情,但无论如何它都会检测到点击..这种情况不会发生在我的情况下。 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 ! 你的placelist缺少onItemClickListener And you can setOnClickListener to your item if it has Button or others. 如果它有Button或其他,你可以setOnClickListener到你的项目。

1.When I click the item another activity is started. 1.当我单击该项目时,将启动另一个活动。

To do so, just after placeslist.setAdapter(listAdapter); 为此,请在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. 2.长按时,会显示上下文菜单。

Check this 检查一下

Android doesn't allow to select list items that have focusable elements in Item's layout . Android不允许选择在Item的布局中具有可聚焦元素的列表项。

disable focusable in your Layout's items 在Layout的项目中禁用焦点

android:focusable="false" 机器人:可聚焦=“假”

add the code you want to execute on click inside click listener inside getView 在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;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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