Android:ListView中的OnItemClickListener无法工作

3

我相对于Android开发还比较新,但是我的项目一直顺利进行,直到我遇到了这个问题。我已经调查了这个问题,但是其他问题的解决方案都没有解决我的问题。

我有一个实现了AdapterViewOnItemClickListenerSportsActivity,但当我点击列表项时却没有任何反应。

非常感谢您的帮助。

SportsActivity.java:

public class SportsActivity  extends Activity implements           AdapterView.OnItemClickListener {


ListView mainListView;
JSONAdapter mJSONAdapter;



private static final String QUERY_URL = "http://myurl.myurl/jsonOutput.php";
ProgressDialog mDialog;

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

    // Access the ListView
    mainListView = (ListView) findViewById(R.id.list);

    // Set this activity to react to list items being pressed
    mainListView.setOnItemClickListener(this);

    // Create a JSONAdapter for the ListView
    mJSONAdapter = new JSONAdapter(this, getLayoutInflater());

    // Set the ListView to use the ArrayAdapter
    mainListView.setAdapter(mJSONAdapter);

    mDialog = new ProgressDialog(this);
    mDialog.setMessage("Searching for Clubs");
    mDialog.setCancelable(false);

    // Create a client to perform networking
    AsyncHttpClient client = new AsyncHttpClient();

    // Show ProgressDialog to inform user that a task in the background is  occurring
    mDialog.show();

            // Have the client get a JSONArray of data
    // and define how to respond
    client.get(QUERY_URL, new JsonHttpResponseHandler() {

                @Override
                public void onSuccess(JSONObject jsonObject) {

                    // Dismiss the ProgressDialog
                    mDialog.dismiss();

                    // update the data in your custom method.
                     mJSONAdapter.updateData(jsonObject.optJSONArray("vfss"));
                }

                @Override
                public void onFailure(int statusCode, Throwable throwable, JSONObject error) {

                    // Dismiss the ProgressDialog
                    mDialog.dismiss();

                    // Display a "Toast" message
                    // to announce the failure
                    Toast.makeText(getApplicationContext(), "Network error, please close app and try again", Toast.LENGTH_LONG).show();

                    // Log error message
                    // to help solve any problems
                    Log.e("omg android", statusCode + " " + throwable.getMessage());
                }
            }
    );

}

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

    // Now that the user's chosen an item, grab the cover data
    //JSONObject jsonObject = (JSONObject) mJSONAdapter.getItem(position);
    //String clubImage = jsonObject.optString("Image_Path","");

    Toast.makeText(SportsActivity.this,"Clicked",Toast.LENGTH_SHORT).show();

    // create an Intent to take you over to a new DetailActivity
    Intent clubIntent = new Intent(this, ClubActivity.class);

    // pack away the data about the cover
    // into your Intent before you head out
    //clubIntent.putExtra("clubImage", clubImage);

    // start the next Activity using your prepared Intent
    startActivity(clubIntent);
}

}

activity_sports.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="#F1F1F1"
tools:context=".MainActivity" >

<ListView
    android:id="@+id/list"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:listitem="@layout/row">

</ListView>

</LinearLayout>

row.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/LinearLayout1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="4dp"
android:orientation="vertical"
android:background="#ffffffff"
android:descendantFocusability="blocksDescendants">

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="80dp"
    android:layout_marginLeft="10dp"
    android:layout_marginRight="10dp"
    android:orientation="horizontal"
    android:showDividers="none"
    android:focusable="false"
    android:clickable="false">

    <ImageView
        android:id="@+id/ivImage"
        android:layout_width="70dp"
        android:layout_height="70dp"
        android:src="@mipmap/sports256"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="2dp"
        android:focusable="false"
        android:clickable="false"/>



        <TextView
            android:id="@+id/tvName"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@string/clubName"
            android:layout_weight="0.7"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:textColor="#ff000000"
            android:textSize="25sp"
            android:maxWidth="80dp"
            android:minWidth="80dp"
            android:focusable="false"
            android:clickable="false"/>

        <ImageView
            android:layout_width="20dp"
            android:layout_height="20dp"
            android:src="@mipmap/point"
            android:layout_gravity="center_vertical"
            android:layout_marginLeft="10dp"
            android:layout_weight="0.1"
            android:focusable="false"
            android:clickable="false"/>



</LinearLayout>

</LinearLayout>

当我点击某个项时,logcat:

05-22 22:40:20.851    6628-6628/dmca.vfss I/libpersona﹕ KNOX_SDCARD checking this for 10340
05-22 22:40:20.851    6628-6628/dmca.vfss I/libpersona﹕ KNOX_SDCARD not a persona
05-22 22:40:37.531    6628-6628/dmca.vfss V/ActivityThread﹕ updateVisibility : ActivityRecord{22ae818d token=android.os.BinderProxy@28038da6 {dmca.vfss/dmca.vfss.MainActivity}} show : false
05-22 22:40:20.851    6628-6628/dmca.vfss E/Zygote﹕ MountEmulatedStorage()
05-22 22:40:20.851    6628-6628/dmca.vfss E/Zygote﹕ v2
05-22 22:40:20.931    6628-6628/dmca.vfss I/SELinux﹕ Function: selinux_compare_spd_ram, SPD-policy is existed. and_ver=SEPF_SM-N9005_4.4.2 ver=40
05-22 22:40:20.931    6628-6628/dmca.vfss I/SELinux﹕ Function: selinux_compare_spd_ram , priority [2] , priority version is VE=SEPF_SM-N9005_5.0_0002
05-22 22:40:20.931    6628-6628/dmca.vfss E/SELinux﹕ [DEBUG] get_category: variable seinfo: default sensitivity: NULL, cateogry: NULL
05-22 22:40:20.931    6628-6628/dmca.vfss I/art﹕ Late-enabling -Xcheck:jni
05-22 22:40:20.971    6628-6628/dmca.vfss D/TimaKeyStoreProvider﹕ TimaSignature is unavailable
05-22 22:40:20.971    6628-6628/dmca.vfss D/ActivityThread﹕ Added TimaKeyStore provider
05-22 22:40:21.021    6628-6628/dmca.vfss D/ResourcesManager﹕ creating new AssetManager and set to /data/app/dmca.vfss-1/base.apk
05-22 22:40:21.161    6628-6628/dmca.vfss D/Activity﹕ performCreate Call secproduct feature valuefalse
05-22 22:40:21.161    6628-6628/dmca.vfss D/Activity﹕ performCreate Call debug elastic valuetrue
05-22 22:40:21.181    6628-6653/dmca.vfss D/OpenGLRenderer﹕ Render dirty regions requested: true
05-22 22:40:21.191    6628-6628/dmca.vfss D/Atlas﹕ Validating map...
05-22 22:40:21.211    6628-6653/dmca.vfss I/Adreno-EGL﹕ <qeglDrvAPI_eglInitialize:410>: EGL 1.4 QUALCOMM build: AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.025_msm8974_LA.BF.1.1_RB1__release_AU ()
OpenGL ES Shader Compiler Version: E031.25.01.03
Build Date: 11/19/14 Wed
Local Branch: mybranch5813579
Remote Branch: quic/LA.BF.1.1_rb1.11
Local Patches: NONE
Reconstruct Branch: AU_LINUX_ANDROID_LA.BF.1.1_RB1.05.00.00.002.025 + 30e7589 +  NOTHING
05-22 22:40:21.211    6628-6653/dmca.vfss I/OpenGLRenderer﹕ Initialized EGL, version 1.4
05-22 22:40:21.241    6628-6653/dmca.vfss I/OpenGLRenderer﹕ HWUI protection enabled for context ,  &this =0xaef22088 ,&mEglDisplay = 1 , &mEglConfig = 8
05-22 22:40:21.251    6628-6653/dmca.vfss D/OpenGLRenderer﹕ Enabling debug mode 0
05-22 22:40:21.331    6628-6628/dmca.vfss I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@28038da6 time:398511238
05-22 22:40:36.701    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:36.851    6628-6628/dmca.vfss I/Timeline﹕ Timeline: Activity_launch_request id:dmca.vfss time:398526750
05-22 22:40:36.911    6628-6628/dmca.vfss D/AbsListView﹕ Get MotionRecognitionManager
05-22 22:40:36.971    6628-6628/dmca.vfss D/Activity﹕ performCreate Call secproduct feature valuefalse
05-22 22:40:36.971    6628-6628/dmca.vfss D/Activity﹕ performCreate Call debug elastic valuetrue
05-22 22:40:36.971    6628-7916/dmca.vfss I/System.out﹕ Thread-187779(ApacheHTTPLog):Reading from variable values from setDefaultValuesToVariables
05-22 22:40:36.981    6628-7916/dmca.vfss I/System.out﹕ Thread-187779(ApacheHTTPLog):isShipBuild true
05-22 22:40:36.981    6628-7916/dmca.vfss I/System.out﹕ Thread-187779(ApacheHTTPLog):SmartBonding Enabling is true, SHIP_BUILD is true, log to file is false, DBG is false
05-22 22:40:37.181    6628-6628/dmca.vfss I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@108d0db6 time:398527086
05-22 22:40:43.041    6628-7916/dmca.vfss I/System.out﹕ pool-1-thread-1 calls detatch()
05-22 22:40:43.081    6628-6628/dmca.vfss W/Settings﹕ Setting airplane_mode_on has moved from android.provider.Settings.System to android.provider.Settings.Global, returning read-only value.
05-22 22:40:43.111    6628-8487/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.111    6628-8485/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.111    6628-8485/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isShipBuild true
05-22 22:40:43.111    6628-8487/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isShipBuild true
05-22 22:40:43.111    6628-8487/dmca.vfss I/System.out﹕ (HTTPLog)-Thread-187787-964167417: SmartBonding Enabling is false, SHIP_BUILD is true, log to file is false, DBG is false
05-22 22:40:43.111    6628-8487/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.111    6628-8485/dmca.vfss I/System.out﹕ (HTTPLog)-Thread-187785-202010435: SmartBonding Enabling is false, SHIP_BUILD is true, log to file is false, DBG is false
05-22 22:40:43.111    6628-8485/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.121    6628-8486/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.121    6628-8486/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isShipBuild true
05-22 22:40:43.121    6628-8486/dmca.vfss I/System.out﹕ (HTTPLog)-Thread-187786-522844608: SmartBonding Enabling is false, SHIP_BUILD is true, log to file is false, DBG is false
05-22 22:40:43.121    6628-8486/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.131    6628-6628/dmca.vfss E/ViewRootImpl﹕ sendUserActionEvent() mView == null
05-22 22:40:43.151    6628-8487/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.151    6628-8485/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.151    6628-8486/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:43.161    6628-8487/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:44.231    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:44.911    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:45.451    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:45.681    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:45.971    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:46.291    6628-8485/dmca.vfss I/System.out﹕ (HTTPLog)-Static: isSBSettingEnabled false
05-22 22:40:46.521    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:46.751    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:46.961    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:40:47.141    6628-6628/dmca.vfss D/ViewRootImpl﹕ ViewPostImeInputStage ACTION_DOWN
05-22 22:41:47.261    6628-6628/dmca.vfss V/ActivityThread﹕ updateVisibility : ActivityRecord{1f9e9c31 token=android.os.BinderProxy@108d0db6 {dmca.vfss/dmca.vfss.SportsActivity}} show : true
05-22 22:42:46.921    6628-6635/dmca.vfss W/art﹕ Suspending all threads took: 6.217ms
05-22 22:48:56.991    6628-6635/dmca.vfss W/art﹕ Suspending all threads took: 8.950ms

JSONAdapter.java:

package dmca.vfss;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import org.json.JSONArray;
import org.json.JSONObject;


public class JSONAdapter extends BaseAdapter {

Context mContext;
LayoutInflater mInflater;
JSONArray mJsonArray;

public JSONAdapter(Context context, LayoutInflater inflater) {
    mContext = context;
    mInflater = inflater;
    mJsonArray = new JSONArray();
}

@Override
public boolean isEnabled (int position) {
    return false;
}



@Override
public int getCount() {
    return mJsonArray.length();
}

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;

    // check if the view already exists
    // if so, no need to inflate and findViewById again!
    if (convertView == null) {

        // Inflate the custom row layout from your XML.
        convertView = mInflater.inflate(R.layout.row, null);

        // create a new "Holder" with subviews
        holder = new ViewHolder();
        holder.thumbnailImageView = (ImageView) convertView.findViewById(R.id.ivImage);
        holder.titleTextView = (TextView) convertView.findViewById(R.id.tvName);


        // hang onto this holder for future recycling
        convertView.setTag(holder);
    } else {


        // just get the holder you already made
        holder = (ViewHolder) convertView.getTag();
    }

    // Get the current data in JSON form
    JSONObject jsonObject = (JSONObject) getItem(position);

    // See if there is an image path in the Object
    if (jsonObject.has("Image_Path")) {



        // Construct the image URL (specific to API)
        String imageURL = jsonObject.optString("Image_Path");

        // Use Picasso to load the image
        // Temporarily have a placeholder in case it's slow to load
        Picasso.with(mContext).load(imageURL).into(holder.thumbnailImageView);
    } else {

        // If there is no cover ID in the object, use a placeholder
        holder.thumbnailImageView.setImageResource(R.mipmap.sports256);
    }

    // Grab the club name from the JSON
    String clubName = "";


    if (jsonObject.has("Club_Name")) {
        clubName = jsonObject.optString("Club_Name");
    }



    // Send the String to the TextView for display
    holder.titleTextView.setText(clubName);



    return convertView;
}

// this is used so you only ever have to do
// inflation and finding by ID once ever per View
private static class ViewHolder {
    public ImageView thumbnailImageView;
    public TextView titleTextView;

}

public void updateData(JSONArray jsonArray) {
    // update the adapter's dataset
    mJsonArray = jsonArray;
    notifyDataSetChanged();
}
}

添加Toast.makeText(SportsActivity.this,"Clicked",Toast.LENGTH_SHORT).show(); 然后告诉我它是否弹出提示。 - Eugene H
嗨,尤金,感谢您的回复。我也没有看到任何提示。如果有帮助,我已经添加了logcat? - dmca
刚刚发布了一个答案。 - Eugene H
它是否成功发送了消息? - Eugene H
删除所有的clickable="false"focusable="false"descendantFocusability="blocksDescendants" - njzk2
3个回答

2

只需从您的JSONAdapter中删除以下内容,它就可以正常工作 :)

@Override
public boolean isEnabled (int position) {
   return false;
}

如果没有至少返回true。更多信息请参见这里

我无法感谢你的足够,这让我快疯了!!你的答案正是我的适配器出了问题,我现在必须学习一下这个主题。我已经用Toast使它工作了。 - dmca
问题大多数都很小,但找到它们真的很难...很高兴能帮忙!! - Mithun

0
试一下这个,如果可以的话请告诉我。删除


implements AdapterView.OnItemClickListener 

并添加:

mainListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        Toast.makeText(SportsActivity.this,"Clicked",Toast.LENGTH_SHORT).show();
    }
});

嗨。我删除了implements...,并将现有的setOnItemClickListener编辑为以上内容,但仍然没有toast。同时仍在获取ViewPostImeInputStage ACTION_DOWN。 - dmca

0
在你的 row.xml 文件中,在 TextViewImageView 中添加此属性。
android:focusableInTouchMode="false" 

这可能有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接