0

我希望手动重新排列 ListView 的顺序。我(想要)实现这一点的方法是点击要移动的项目,将该项目的背景设置为不同的颜色,存储它的位置(oldPosition),然后点击它要出现在下面的项目,最后重置原始项目位置的背景。

我用来执行此操作的代码是:-

    List<String> catarray;            //  string array declared in main activity
    ArrayAdapter<String> catadapter;  //  adapter for Spinner declared in main activity
    ListView cats;                    //  listview declared in list activity
    ArrayAdapter<String> adapter;     //  adapter for listview declared in list activity
    int oldPosition = -1;

    cats.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            if (oldPosition < 0) {
                oldPosition = position;
                try {
                    dr = parent.getChildAt(position).getBackground();
                    parent.getChildAt(position).setBackgroundColor(Color.argb(255, 0, 153, 204));
                }
                catch (Exception e) {
                }
            }
            else {
                String item = PhotoActivity.catarray.remove(oldPosition);
                PhotoActivity.catarray.add(position,item);
                try {
                    parent.getChildAt(oldPosition).setBackground(dr);
                }
                catch (Exception e) {
                }
                oldPosition = -1;
                changed = true;

                PhotoActivity.catadapter.notifyDataSetChanged();
                adapter.notifyDataSetChanged();
            }
        }
   }); 

我遇到的问题是,如果列表大于显示的视图,那么我点击的两个项目都会改变背景,但低于可见范围的附加项目也会改变。

因此,例如,如果完整列表是 12 个项目长,其中前 8 个项目正在显示,如果我点击第二个项目,那么该项目和项目 11 (即第二个项目加一个低于可见范围)突出显示。

  1. 为什么会这样?

  2. 我该如何停止它,或者,如果我不能这样做,请重置错误突出显示的项目,因为它不可见,因此无法通过 parent.getChildAt ...

4

1 回答 1

0

我找到的唯一答案是为适配器添加一个 getView 方法,调用 super.getView 然后在那里更改背景颜色。

此外,您需要在 OnItemClickListener 事件中调用 view.setBackgroundColor 以确保在单击时更改背景。

所以,我的代码最终是: -

    cats.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

            if (oldPosition < 0) {
                oldPosition = position;
                try {
                    view.setBackgroundColor(Color.argb(255, 0, 153, 204));
                }
                catch (Exception e) {
                }
            }
            else {
                String item = PhotoActivity.catarray.remove(oldPosition);
                PhotoActivity.catarray.add(position,item);
                oldPosition = -1;
                changed = true;

                PhotoActivity.catadapter.notifyDataSetChanged();
                adapter.notifyDataSetChanged();
            }
        }
   }); 

   adapter = new ArrayAdapter<String>(c, android.R.layout.simple_list_item_1, PhotoActivity.catarray) {
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            TextView textView = (TextView) super.getView(position, convertView, parent);

            if (oldPosition> -1 && oldPosition==position) {
                textView.setBackgroundColor(Color.argb(255, 0, 153, 204));
            }
            else {
                textView.setBackgroundColor(Color.argb(0, 0, 0, 0));
            }
            return textView;
        }           
    };

    cats.setAdapter(adapter);

我感谢卡梅伦索尔在这里回答,为我指明了正确的方向。

于 2013-11-11T15:07:16.457 回答