2012-06-18 106 views
2

我想爲使用2個面板的平板電腦創建應用程序。左邊是菜單,右邊是內容展示者。實際上,我期望的行爲與Gmail應用中的行爲類似。多窗格佈局

enter image description here

我目前使用2個片段。一個基本上是一個帶有房間名稱和一些按鈕的ListView。另一個(內容)包括關於所選房間的一些信息。

我在左側面板中選擇的房間應該保持突出顯示 - 就像在Gmail應用程序中一樣。我試圖用很多小時來使用選擇器來達到這個效果,但是失敗了。

而且我發現這個方法2樓不同的觀點..

1)"Do not try to keep the focus or selection in touch mode"

2)"In general, use the pane on the right to present more information about the item you selected in the left pane. Make sure to keep the item in the left pane selected in order to establish the relationship between the panels."

你能告訴我如何做到這一點(只是爲了保持區別於所選項目其餘的部分)? 也許一個ListView不是最好的方法嗎?

UPDATE

由於克里斯托夫埃伯哈特的答案,我創建了一個工作正常的示例項目。它的問世on github.

+0

在我老的答案修正的樣本:第一個答案是從我的代碼複製,我使用的是ListFragment,它實際上起作用。我編輯過的安澤現在應該可以工作了 –

回答

3

創建RES /繪製一個XML文件/ list_item_selector.xml

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <item android:state_selected="true" android:drawable="@drawable/list_pressed" /> 
    <item android:drawable="@drawable/list_default" /> 
</selector> 

對於列表元素做出自己的XML文件RES /佈局/ list_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:textAppearance="?android:attr/textAppearanceLarge" 
    android:gravity="center_vertical" 
    android:minHeight="?android:attr/listPreferredItemHeight" 
    android:paddingLeft="20dp" 
    android:background="@drawable/list_item_selector" 
/> 

然後當創建列表適配器時,請執行以下操作:

setListAdapter(new CustomAdapter<String>(getActivity(), 
      R.layout.list_item, stringArray)); 

現在,您只需要做的就是提供可繪製list_default和list_pressed 和list_altered

的CustomAdpater樣子:

package com.test.listview_keep_selected; 

import android.app.Activity; 
import android.content.Context; 
import android.graphics.drawable.StateListDrawable; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

public class CustomAdapter<T> extends ArrayAdapter<T> { 

    private Context m_cContext; 

    public CustomAdapter(Context context, int textViewResourceId, 
      T[] objects) { 

     super(context, textViewResourceId, objects); 
     this.m_cContext = context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     final View returnView = super.getView(position, convertView, parent); 
     final ListView listView = (ListView) ((Activity) m_cContext).findViewById(R.id.listViewTest); 
     returnView.setOnClickListener(new OnClickListener(
       ) { 


      @Override 
      public void onClick(View v) { 
       for(int i = 0; i< listView.getChildCount(); i++) 
        listView.getChildAt(i).setSelected(false); 
       StateListDrawable states = new StateListDrawable(); 
       states.addState(new int[] {android.R.attr.state_selected}, 
         m_cContext.getResources().getDrawable(R.drawable.list_pressed)); 
       states.addState(new int[] { }, 
         m_cContext.getResources().getDrawable(R.drawable.list_altered)); 
       v.setBackgroundDrawable(states); 
       v.setSelected(true); 
      } 
     }); 
     return returnView; 
    } 

} 

編輯:

如果你沒有它已經:

的ListView .setChoiceMode(ListView.CHOICE_MODE_SINGLE);

編輯: 不要設置選擇模式與普通的ListView,纔有意義,如果你有例如一個ListFragment,因爲我在我的代碼中有

現在還不完美,但是從現在起,你應該在打了一會兒之後就可以好了。

什麼也可能有助於爲:ListView item background via custom selector

編輯:

現在它應該工作,只要你想它^^

+0

我按照你的指示。這不會使選定的項目高亮顯示。事實上,它在被按下時甚至沒有被突出顯示。 :(以下是我的結果:https://github.com/gisek/ListView_test我錯過了什麼嗎? – gisek

+0

我會馬上測試你的代碼 –

+0

首先感謝你的時間。我認爲你的list_item.xml缺少一個line [android:background =「@ drawable/list_item_selector」]。現在效果更好一些。列表項是藍色的,當我觸摸它時會變成紅色,但它仍然沒有對我至關重要的功能。我釋放它變成藍色的項目,但應該保持紅色,直到我按下另一個。 – gisek