Android SDK问题设置/重置ListView项目背景

时间:2013-11-11 00:18:42

标签: android listview background

我希望手动重新排列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 ...

1 个答案:

答案 0 :(得分: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);

感谢Cameron Saul在回答here时指出我正确的方向。