在两个窗格模式下维护列表视图中的选择

时间:2012-11-11 19:25:04

标签: android listview

我尝试创建一个类似gmail的界面,用户点击左侧列表并在右侧显示内容。我已经到了左边有一个列表的位置,用户可以点击并突出显示该项目(我是初学者)。问题是,如果用户点击for-now空的右侧,突出显示的项目将不再突出显示。

public class profileListFragment extends ListFragment {

    String[] countries = new String[] {"USA", "China"};

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        ArrayAdapter<String> adapter = new ArrayAdapter<String>(inflater.getContext(),
                android.R.layout.simple_list_item_1,countries);
        setListAdapter(adapter);
//      View listView = getActivity().findViewById(R.id.list));
        View retView = inflater.inflate(R.layout.fragment_load_profile_list_layout,container, false);
        ListView lv = (ListView) retView.findViewById(android.R.id.list);
        lv.setSelector(android.R.color.holo_orange_light);
        lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);
//      lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);

        return retView;
//      return super.onCreateView(inflater, container,  savedInstanceState);
    }

    @Override
    public void onPause(){

    }
}

如果您需要查看更多代码,请告诉我们。提前谢谢

修改

我已将代码编辑如下:

lv.setSelector(R.drawable.profile_list_selector);

并且profile_list_selector.xml位于&#34; drawable&#34;文件夹,如下:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >

    <item android:state_enabled="false"
        android:drawable="@android:color/holo_green_dark" />

    <item android:state_pressed="true"
        android:drawable="@android:color/holo_blue_dark" />

    <item android:state_focused="true" android:state_enabled="true"
        android:drawable="@android:color/holo_blue_bright" />

    <item android:state_enabled="true"
        android:drawable="@android:color/holo_orange_dark" />


</selector>

我现在注意到的是,在右侧屏幕上,只有当我点击右侧的文本框时才会丢失高亮显示...如果我点击一个复选框,则会保留突出显示的项目。完全混淆了所有这些

2 个答案:

答案 0 :(得分:1)

这个问题很老,但我最近遇到了这个问题。我有一个双窗格平板电脑布局。一个窗格具有项目的ListView,第二个窗格显示在第一个窗格中选择的项目。当选择ListView中的项目时,我想将其标记,然后更改第二个窗格。当用户旋转设备时,我想保持标记当前选择。这是我的解决方案:

在我的列表片段中,我保持一个位置。这将保存在SavedInstanceState上并在onCreate中恢复。该位置在点击期间更新,并且还传递给适配器。在onListItemClick中,我也相应地更改了视图的背景颜色。

public class MyListFragment extends ListFragment {

    private static final String LIST_ITEM_SELECTED = "list_item_selected";

    // keep the item selected to handle rotation
    private int mPositionSelected = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (savedInstanceState != null) {
            mPositionSelected = savedInstanceState.getInt(LIST_ITEM_SELECTED, 0);
        }

        mAdapter = new MyAdapter(getActivity());
        mAdapter.setPositionSelected(mPositionSelected);
        setListAdapter(mAdapter);

    }

    @Override
    public void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        if (Utils.isTablet(getActivity())) {
            outState.putInt(LIST_ITEM_SELECTED, mPositionSelected);
        }
    }

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);
        // If this is a tablet layout the inspections list is visible.
        // so send an event to change them.
        if (Utils.isTablet(getActivity())) {
            // set the old view's bg back to black
            l.getChildAt(mPositionSelected).setBackgroundColor(Color.BLACK);
            // set the selected view's bg
            v.setBackgroundColor(Color.BLUE);
            // keep the selected position
            mPositionSelected = position;
            // tell the adapter the currently selected position
            mInspectionsByMonthAdapter.setPositionSelected(mPositionSelected);
            // let the other fragment know the items it should display
            EventBus.getInstance().post(...);
        } else {
            // else, we need to navigate to a new fragment.
        }
    }

}

在适配器中,我也保持选择位置。旋转设备时,在getView方法中,将突出显示所选项目。

public class MyAdapter extends BaseAdapter {

    private LayoutInflater mInflater;
    private int mPositionSelected;
    private Context mContext;

    static class MyViewHolder {
        TextView yearMonth;
        TextView number;
    }

    public MyAdapter(Context context) {
        mContext = context;
        mInflater = LayoutInflater.from(context);
    }

    public void setPositionSelected(int positionSelected) {
        mPositionSelected = positionSelected;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        MyViewHolder myViewHolder;

        if (convertView == null) {  // if it's not recycled, initialize some attributes
            convertView = mInflater.inflate(R.layout.my_layout, null);
            myViewHolder = new MyViewHolder();

            myViewHolder.yearMonth = (TextView) convertView.findViewById(R.id.yearMonthInspections);
            myViewHolder.number = (TextView) convertView.findViewById(R.id.numberOfInspections);

            convertView.setTag(myViewHolder);

        } else {
            myViewHolder = (MyViewHolder) convertView.getTag();
        }

        myViewHolder.yearMonth.setText(...);
        myViewHolder.number.setText(...);

        // set background color to the selected position.
        // this is used rotations. The position is maintained here and
        // in the fragment
        if (mPositionSelected == position) {
            convertView.setBackgroundColor(Color.BLUE);
        }

        return convertView;
    }
}

我希望这会有所帮助。

答案 1 :(得分:0)

不幸的是,AFAIK没有简单的答案。

您必须执行类似自定义适配器的操作,以不同方式绘制当前选定的项目。您还需要跟踪所选的项目状态。

请参阅此博文,了解可能的解决方案。

http://bestsiteinthemultiverse.com/2009/12/android-selected-state-listview-example/