【问题标题】:Android - OnItemClickListener only *sometimes* not workingAndroid - 仅 OnItemClickListener *有时*不工作
【发布时间】:2016-03-07 02:27:09
【问题描述】:

我的一个活动中有一个ListView,我使用自定义ArrayAdapter 绑定到ArrayList。我已将OnItemClickListener 设置为ListView,它应该调用一个启动另一个活动的方法。但是,我发现当我点击ListView 项目时,它只有有时 有效。有时它会按应有的方式启动活动;其他时候它似乎检测到点击(列表项上出现涟漪效应)但什么也不做;其他时候它甚至没有检测到点击(没有出现涟漪效应)。

我已经尝试了我遇到的所有常见建议:在父视图项上阻止后代,在项目视图的所有组件上将可点击和可聚焦设置为 false,将 isEnabled 设置为在自定义适配器等,但行为保持不变。任何帮助表示赞赏。以下是相关代码:

包含 ListView 的活动:

    public class ViewCollectionActivity extends AppCompatActivity {

    private final String className = this.getClass().getSimpleName();
    private CollectionHandler collectionHandler;
    private Context context;
    private ArrayList<Game> displayedCollection;
    private GameCollectionAdapter collectionAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_view_collection);
        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
        context = this;

        collectionHandler = CollectionHandler.getInstance(this);

        TextView view = null;
        if (collectionHandler.getDisplayedCollection().size() > 0) {
            view = (TextView) findViewById(R.id.no_items_textview);
            view.setVisibility(View.GONE);
        }
        String currentDate = collectionHandler.getDateLastSynchronised();

        view = (TextView) findViewById(R.id.last_updated_textview);
        view.setText("Last synchronised: " + currentDate + "   Total games: " + String.valueOf(collectionHandler.getDisplayedCollection().size()));

        collectionAdapter = collectionHandler.getCollectionAdapter();
        ListView listView = (ListView) findViewById(R.id.collection_list_view);
        listView.setAdapter(collectionAdapter);
        AdapterView.OnItemClickListener collectionItemClickListener = new AdapterView.OnItemClickListener(){
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                launchGameDetailsActivity(position);
            }
        };
        listView.setOnItemClickListener(collectionItemClickListener);

    }

    public void launchGameDetailsActivity(int position){
        Log.d(className,"Starting lauchGameDetailsActivity method");
        collectionHandler.setSelectedGame(position);
        Intent intent = new Intent(this,ViewGameDetailsActivity.class);
        startActivity(intent);
        Log.d(className, "Ending lauchGameDetailsActivity method");
    }

活动的 XML:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.bleachedlizard.ludome.viewcollection.ViewCollectionActivity">

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Synchronise Collection"
        android:onClick="synchroniseCollection"/>

    <TextView
        android:id="@+id/last_updated_textview"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Last synchronised: "
        android:textAlignment="center"
        />

    <Button
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Display Collection"
        android:visibility="gone"
        android:onClick="displayCollection"/>

    <ListView
        android:id="@+id/collection_list_view"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1">


    </ListView>
    <TextView
        android:id="@+id/no_items_textview"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:text="You have no items in your collection."
        android:textAlignment="center"
        android:textSize="20sp"/>

</LinearLayout>

项目视图的 XML:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/collection_item_layout"
    android:layout_width="match_parent"
    android:layout_height="75dp"
    android:orientation="horizontal"
    android:clickable="false"
    android:descendantFocusability="blocksDescendants"
    android:focusable="false"
    android:focusableInTouchMode="false">

    <ImageView
        android:id="@+id/collection_item_image"
        android:layout_width="75dp"
        android:layout_height="75dp"
        android:src="@drawable/testimage"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="false"
        />

    <TextView
        android:id="@+id/collection_item_name"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:gravity="center_vertical"
        android:padding="16dp"
        android:singleLine="false"
        android:textColor="@android:color/darker_gray"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="false"
        android:textIsSelectable="false"/>

    <TextView
        android:id="@+id/collection_item_plays"
        android:layout_width="100dp"
        android:layout_height="match_parent"
        android:gravity="center_vertical"
        android:padding="8dp"
        android:textColor="@android:color/darker_gray"
        android:text="Plays: 0"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:clickable="false"
        android:textIsSelectable="false"/>

</LinearLayout>

自定义适配器的代码:

    public class GameCollectionAdapter extends ArrayAdapter<Game> {

    private ArrayList<Game> collection;

    public GameCollectionAdapter(Context context, int resource, ArrayList<Game> collection){
        super(context, resource, collection);

    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LinearLayout gameView = (LinearLayout) convertView;
        LayoutInflater mInflater = LayoutInflater.from(getContext());

        if (gameView == null) {
            gameView = (LinearLayout) mInflater.inflate(R.layout.collection_item_view, null);

        }

        //Game game = collection.get(position);
        Game game = super.getItem(position);


        if (game != null) {

            // This is how you obtain a reference to the TextViews.
            // These TextViews are created in the XML files we defined.

            TextView gameTitle = (TextView) gameView.findViewById(R.id.collection_item_name);
            TextView numOfPlays = (TextView) gameView.findViewById(R.id.collection_item_plays);
            ImageView thumbnail = (ImageView) gameView.findViewById(R.id.collection_item_image);

            // check to see if each individual textview is null.
            // if not, assign some text!
            if (gameTitle != null){
                gameTitle.setText(game.getTitle());
            }
            if (numOfPlays != null){
                numOfPlays.setText("Plays: " + String.valueOf(game.getNumOfPlays()));
            }
            if (thumbnail != null){
                thumbnail.setImageBitmap(game.getThumbnail());
            }
        }

        // the view must be returned to our activity
        return gameView;
    }

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

}

【问题讨论】:

  • 它会显示来自launchGameDetailsActivity 方法的两个日志吗?
  • 在什么都没有发生的情况下,不 - 它不显示任何日志。
  • 你可以尝试将 onClickListener 直接添加到 getView 中膨胀的视图中吗?
  • 为什么您的列表项设置为不可点击或不可聚焦?这不会停止点击监听器吗?
  • @halfer 谢谢 - 我会记住的!

标签: android listview


【解决方案1】:

我发现了导致问题的原因:我设置支持 ListView 的数组的方式意味着它一直在为数组中的每个元素下载和存储位图。一旦我更改了实现,使其只下载 ListView 需要的图像,那么这似乎提高了性能并且 onClickListener 开始正常工作。

我使用的实现与此处显示的完全相同:

http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

【讨论】:

    【解决方案2】:

    我认为问题是由于您单击时项目选择的位置,您有一个列表位置,该位置传递给您的方法launchGameDetailActivity(int position) 使用日志或 toast 检查项目单击您获得的所有位置做什么需要。

    这是我的代码,如果有帮助,请尝试这样。

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Toast.makeText(RecipeClass.this, "Position is" + position, Toast.LENGTH_SHORT).show();
                Intent intent = new Intent(RecipeClass.this, RecipeIngredients.class)
                intent.putExtra("position", position);
                startActivity(intent);
            }
    

    检查您的 arraylist 值是否不为空。

    【讨论】:

    • 我试过这个。在没有任何反应的情况下,Toast 不会出现。
    • 没关系。 OP 在方法中已经有日志。这意味着监听器工作不正常。
    猜你喜欢
    • 1970-01-01
    • 2011-11-26
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多