Fragment ListView onItemClick 突出显示不正确的项目

Fragment ListView onItemClick Highlights Incorrect Item

我有一个 ListView 包含在 Fragment 中。在 onCreateView 部分,我为列表设置了 onItemClickListener。我的目的是突出显示所选项目,但是单击后 ListViewItems 之间的 space 被着色而不是项目本身。 我也考虑过使用 Selector 但没有成功,IE: view.setBackgroundDrawable(view.getContext().getResources().getDrawable(R.drawable.list_selector));

有办法解决这个问题吗?还是需要引入新的 RowLayoutInflater?提前致谢。

片段

 public static class FragmentRoutine extends Fragment {
    DatabaseHandler db;
    private ListView routineListView;
    private List<Routine> routines = new ArrayList<Routine>();
    ArrayAdapter<Routine> routineAdapter;
    Routine longClickedItemRoutines;
    private SelectedAdapter selectedAdapter;
    ImageButton btnMoveUp,btnMoveDown;
    public FragmentRoutine() {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.routines,
                container, false);
        db = new DatabaseHandler(getActivity().getApplicationContext());
        routineListView = (ListView) rootView.findViewById(R.id.routineList);
        registerForContextMenu(routineListView);
        db.closeDB();
        if (db.getRoutineCount() != 0)
            routines.clear();
        routines.addAll(db.getAllRoutines());
        populateList();
        selectedAdapter = new SelectedAdapter(this.getActivity(),0,routines);
        selectedAdapter.setNotifyOnChange(true);
        routineListView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                longClickedItemRoutines = routines.get(position);
                return false;
            }
        });
        routineListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView adapterView, View view,
                                    int position, long id) {
                for (int h = 0; h < adapterView.getChildCount(); h++)
                    adapterView.getChildAt(h).setBackgroundColor(Color.TRANSPARENT);
                // change the background color of the selected element
                view.setBackgroundColor(Color.LTGRAY);
            }
        });// move up event handler

        ImageButton btnMoveUp =(ImageButton) rootView.findViewById(R.id.btnMoveUp);
        btnMoveUp.setOnClickListener(new AdapterView.OnClickListener() {
            public void onClick(View arg0) {
                moveUp();
            }
        });

        // move down event handler
        ImageButton btnMoveDown =(ImageButton) rootView.findViewById(R.id.btnMoveDown);
        btnMoveDown.setOnClickListener(new AdapterView.OnClickListener() {
            public void onClick(View arg0) {
                moveDown();
            }
        });

        setHasOptionsMenu(true);
        return rootView;
    }

错误在于您在 routineListView 上的 setOnItemClickListener。

更具体地说是 view.setBackgroundColor(Color.LTGRAY); 部分。
您在此处传递的视图是您的 ListView,而不是单击的列表元素。所以你要设置整个列表视图的背景颜色而不是单个元素。但是单个元素位于列表视图的顶部,因此您唯一可以看到颜色的地方是列表元素之间。

要更正此问题,您应该执行以下操作:

routines.get(position).setBackgroundColor(Color.LTGRAY);

这将正确获取单击的列表元素。

您不应在 setOnItemClickListener 中更新视图,而是记录此函数中的位置:

更新

mActiveListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
  @Override
  public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    sSelectedIndex = position;
    // notify ListView's ArrayAdapter that the data attached has been changed, 
    // and any View reflecting the data set should refresh itself.
    yourArrayAdapter.notifyDataSetChanged();
  }
}

然后在 getView 方法中更新片段列表视图:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (convertView == null) {
        convertView = getActivity().getLayoutInflater().inflate(R.layout.list_item_menu, null);
    }

    if (position == sSelectedIndex) {
        convertView.setBackgroundColor(...);
    } else {
        convertView.setBackgroundColor(...);
    }

    return convertView;
}