2016-02-27 77 views
1

我在我的一項活動中有ListView,我使用自定義ArrayAdapter綁定到ArrayList。我已將OnItemClickListener設置爲ListView,它應該調用啓動另一個活動的方法。但是,我發現當我點擊ListView項目時,它只有有時有效。有時它會按照它應該開始的活動;其他時間它似乎檢測到點擊(漣漪效應出現在列表項上)但什麼都不做;其他時候它甚至不會檢測到點擊(漣漪效應不會出現)。Android - OnItemClickListener僅*有時*不工作

我已經嘗試了我遇到過的所有常見建議:阻止父視圖項目的後代,在項目視圖的所有組件上設置可點擊和可聚焦爲false,將isEnabled設置爲在自定義中返回true適配器等,但行爲保持不變。任何幫助讚賞。下面是相關代碼:包含的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; 
    } 

} 
+0

這是否表明你們都從'launchGameDetailsActivity'方法的日誌? – Rohit5k2

+0

在沒有任何事情發生的時候,不 - 它不顯示日誌。 –

+0

你可以嘗試直接添加onClickListener到getView中膨脹的視圖嗎? – aelimill

回答

1

我發現了導致問題的原因:我設置支持ListView的數組的方式意味着它會一直下載和存儲陣列中每個元素的位圖。一旦我改變了實現,以便它只下載ListView所需的圖像,那麼這似乎提高了性能,onClickListener開始正常工作。

我所用的實現是在這裏顯示的完全一樣的一個:

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

+0

很高興你解決了你的問題。乾杯 – Sayyaf

1

我認爲這個問題是由於項目選擇的位置,每當你點擊你有一個列表位置傳遞給你的方法launchGameDetailActivity(int position)檢查與日誌或吐司上項目點擊什麼所有的位置,你正在做的要緊的。

這裏是我的代碼嘗試這個,如果它有幫助。

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值是否不爲空。

+0

我試過了。在沒有任何事情發生的時候,吐司不會出現。 –

+0

沒關係。 OP在方法中已經有了日誌。這意味着收聽者無法正常工作。 – Rohit5k2

相關問題