2012-11-10 44 views
1

我有一個列表視圖,每行有兩種可能的佈局。查找在列表視圖中點擊哪一行

當爲每行實現我的onClick偵聽器時,我試圖找到找出哪種類型的行被點擊的最有效方法,以便我可以從中獲取數據。

有沒有比這更有效的方法?我想訪問getItemViewType(position)功能,但我想不出成功從parent訪問:

// listening to single list item on click 
myListView.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     // selected item's TextView 
     // if the first view is null, it must be the other kind 
     TextView tView = null; 
     if(view.getId() == R.list.layout_a) tView = (TextView) view.findViewById(R.list.text_a); 
      else tView = (TextView) view.findViewById(R.list.text_b); 

     //DO STUFF AND LAUNCH ACTIVITY 
    } 
}); 

佈局 - 這是一個過於簡單的例子,但我需要知道,如果被點擊的行使用R.list.text_aR.list.text_b。我可以給根LinearLayout一個android:id=屬性嗎?

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+list/layout_a" 
android:layout_width="fill_parent" 
android:layout_height="100dip" 

    <TextView 
     android:id="@+list/text_a" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="18dip" /> 
</LinearLayout> 


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+list/layout_b" 
android:layout_width="fill_parent" 
android:layout_height="100dip" 

    <TextView 
     android:id="@+list/text_b" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="18dip" /> 
</LinearLayout> 
+1

我很困惑你的意思是更高效。它的效率就像它會得到大聲笑。你點擊一行,你會得到那些行的東西。通過找出哪種類型的行是什麼意思? – Andy

+0

通過Id查找視圖是一個相對昂貴的調用。我認爲如果你在不同的位置上有不同的文本瀏覽,你可以參考你的數據容器中的位置來查找你有的視圖類型。也許甚至只有一個數組來保存該位置的視圖類型。但是由於您在此之後發起了一項新活動,我認爲這不會經常點擊,因此可能不會感覺到費用。 – mango

+0

@Mango - 上面更新了我的代碼...我可以在上面的LinearLayouts中添加一個'android:id ='屬性嗎?通過調用'view.getId()'來返回適配器的值嗎? – jamis0n

回答

1

我打算假設每個位置內的每個佈局都有不同的ID。如果你不忽略這一點。但是,如果您確實可以將視圖ID與您知道的某個ID進行比較,並確定它是哪種類型的佈局。應該是一個非常便宜的電話。

我相信你應該可以給它一個ID。

+0

查看上面的更新示例。我已經給每個佈局在根級別設置了一個id屬性(比如'android:id =「@ + list/layout_a」'),這是適配器中'view.getId()'返回的ID。 – jamis0n

+0

如果您使用getid()存在任何問題?我會認爲它應該可以正常工作。 –

+0

我會給你答案,因爲那正是我最終做的。也感謝@yahya – jamis0n

1

在你的XML,請將您的意見標籤:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+list/layout_a" 
android:layout_width="fill_parent" 
android:layout_height="100dip" 
android:tag="a" // Here is important part! 

    <TextView 
     android:id="@+list/text_a" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="18dip" /> 
</LinearLayout> 


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+list/layout_b" 
android:layout_width="fill_parent" 
android:layout_height="100dip" 
android:tag="b" // Here is important part! 

    <TextView 
     android:id="@+list/text_b" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:textSize="18dip" /> 
</LinearLayout> 

並在代碼:

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

    if(view.getTag().toString().equals("a")) { 
      // Do whatever you need to do with layout a 
    } else if(view.getTag().toString().equals("b")) { 
      // Do whatever you need to do with layout b 
    } 
} 

});

+0

使用view.getId()讓我到同一個地方:)'if(view.getId()== R.list.layout_a)' – jamis0n

+1

呃...是的,這也可以; ) – yahya

相關問題