2012-06-18 61 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