在自定义列表视图中更改列表项的背景颜色

时间:2012-11-26 10:41:56

标签: android

我使用下面的代码创建一个自定义列表视图....但是这个代码的问题是它只选择一个项目..但突出显示许多项目...我的意思是..例如..如果我有8个列表中的项目..我只能看到3个项目(其余我必须滚动查看)..如果我点击第一个项目...它会与第四个和第7个项目一起突出显示...

public class MainMenu extends Activity {
    ListView lmenu;
    View v1;
    String s;
    Class<?> ourclass;
    View layout, row;
    static int trantype;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menulist);

        Menu Menu_data[] = new Menu[] { new Menu("1.White"),
                new Menu("2.Blue"), new Menu("3.Purple"), new Menu("4.Red"),
                new Menu("5.Yellow"), new Menu("6.Black"), new Menu("6.Black"),
                new Menu("6.Black"), new Menu("6.Black"), new Menu("6.Black"),
                new Menu("6.Black"), new Menu("6.Black") };

        MenuAdapter adapter = new MenuAdapter(this, R.layout.menutext,
                Menu_data);
        lmenu = (ListView) findViewById(R.id.mainmenu);

        lmenu.setAdapter(adapter);

        lmenu.setOnItemClickListener(new OnItemClickListener() {

            public void onItemClick(AdapterView<?> ada, View v, int position,
                    long id) {
                // TODO Auto-generated method stub

                /*
                 * v.setBackgroundColor(Color.parseColor("#FCD5B5")); if (!(v1
                 * == null) && v1 != v)
                 * v1.setBackgroundColor(Color.parseColor("#EEEEEE")); v1 = v;
                 */
                Intent swipeit = new Intent(getBaseContext(), Swipeit.class);
                trantype = position + 1;
                startActivity(swipeit);
            }
        });

        findViewById(R.id.BLogout).setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                // TODO Auto-generated method stub
                finish();
            }
        });
    }

    public class Menu {
        public String title;

        public Menu() {
            super();
        }

        public Menu(String title) {
            super();
            this.title = title;
        }
    }

    public class MenuAdapter extends ArrayAdapter<Menu> {

        Context context;
        int layoutResourceId;
        Menu data[] = null;
        LayoutInflater inflater;
        boolean[] arrBgcolor;
        private int activeHex, inactiveHex;

        public MenuAdapter(Context context, int layoutResourceId, Menu[] data) {
            super(context, layoutResourceId, data);
            this.layoutResourceId = layoutResourceId;
            this.context = context;
            this.data = data;
            activeHex = Color.parseColor("#FCD5B5");
            inactiveHex = Color.parseColor("#EEEEEE");

            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            arrBgcolor = new boolean[13];
        }

        @Override
        public View getView(final int position, final View convertView,
                ViewGroup parent) {
            try {
                MenuHolder holder = null;
                row = convertView;
                // convertView.setBackgroundColor(Color.BLACK);
                if (row == null) {
                    LayoutInflater inflater = ((Activity) context)
                            .getLayoutInflater();
                    row = inflater.inflate(layoutResourceId, parent, false);
                    holder = new MenuHolder();
                    holder.txtTitle = (TextView) row.findViewById(R.id.tv1);
                    row.setTag(holder);
                } else {
                    holder = (MenuHolder) row.getTag();
                }

                Menu Menu = data[position];
                holder.txtTitle.setText(Menu.title);
                holder.txtTitle.setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        resetArrbg();
                        arrBgcolor[position] = true;
                        if (arrBgcolor[position]) {
                            row.setBackgroundColor(activeHex);
                        } else {
                            row.setBackgroundColor(inactiveHex);
                        }
                        notifyDataSetChanged();
                    }
                });
            } catch (Exception e) {
                Toast.makeText(getApplicationContext(), String.valueOf(e),
                        Toast.LENGTH_LONG).show();
            }
            return row;
        }

        private void resetArrbg() {
            for (int i = 0; i < arrBgcolor.length; i++) {
                arrBgcolor[i] = false;
            }
        }

        public class MenuHolder {
            TextView txtTitle;
        }
    }
}

我的xml包含列表...          

    <include
        android:id="@+id/header"
        android:layout_alignParentTop="true"
        layout="@layout/header" />

    <RelativeLayout
        android:id="@+id/Rlmain"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@+id/header"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/TMain"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerVertical="true"
            android:layout_marginBottom="8dp"
            android:layout_marginLeft="10dp"
            android:layout_marginTop="8dp"
            android:text="Main Menu"
            android:textColor="#000000"
            android:textSize="15dp" />

        <View
            android:id="@+id/Vtop"
            android:layout_width="fill_parent"
            android:layout_height="2dp"
            android:layout_below="@+id/TMain"
            android:background="@android:color/darker_gray" />
    </RelativeLayout>

    <RelativeLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@+id/Vbot"
        android:layout_below="@+id/Rlmain"
        android:orientation="vertical" >

        <ListView
            android:id="@+id/mainmenu"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="#E0E0E0"
            android:cacheColorHint="#00000000"
            android:divider="@android:color/transparent"
            android:dividerHeight="20dp" >
        </ListView>
    </RelativeLayout>

    <View
        android:id="@+id/Vbot"
        android:layout_width="fill_parent"
        android:layout_height="2dp"
        android:layout_above="@+id/textView1"
        android:background="@android:color/darker_gray" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true"
        android:text="© India Transact Services Ltd."
        android:textColor="#000000"
        android:textSize="15dp" />

</RelativeLayout>

我的xml列表....

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LLtv"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="#EEEEEE"
    android:cacheColorHint="#00000000" >

    <TextView
        android:id="@+id/tv1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:paddingBottom="12dp"
        android:paddingTop="12dp"
        android:textColor="#000000"
        android:textSize="20dp" />

</LinearLayout>

可以请任何人帮助我并告诉我哪里出错了吗?

2 个答案:

答案 0 :(得分:1)

这是因为ListView在填充列表时重用了Views的方式。假设您在任何给定时间都看到列表的三行。您可以通过设置背景颜色(与您一样)“突出显示”第一行,然后向下滚动。当第一行离开屏幕时,Android会做一些聪明的事情。不是为第五行创建一个新的View,而是重用第一行的View。这就是你改变了背景颜色的视图,所以第五行现在得到了相同的背景颜色。只有数据被更改。

至于如何在所选行和所选行上实现不同的背景颜色,请查看此answer。我相信你必须实现一个自定义ListAdapter,至少如果你正在开发低于11的API级别。

答案 1 :(得分:1)

使用当前设置无法实现您想要的效果。您需要实现一个自定义适配器,您可以访问getView()方法。由于在答案here中更清楚的原因,您需要做的是使用某种数据容器,它将使用某个指示器保存单个行的状态,然后根据它在容器上的位置执行操作(应该与列表视图中的位置相对应)

例如,看看这个重写:

protected void onListItemClick(ListView l, View v, int position, long id) {
    super.onListItemClick(l, v, position, id);

    resetArrbg();
    arrBgcolor[position] = true;
    if (arrBgcolor[position]) {
        v.setBackgroundColor(Color.parseColor("#FCD5B5"));
    } else {
        v.setBackgroundColor(Color.BLUE);           
    }
}

boolean[] arrBgcolor = new boolean[list.size()];

private void resetArrbg() {
    for (int i = 0; i < arrBgcolor.length; i++) {
        arrBgcolor[i] = false;
    }
}

现在为什么它不适用于当前的设置是否有意义?方法的else部分(影响其他视图的部分)永远不会发生,因为您无权访问onListItemClick方法中的其他位置,但是您在getView()中进行操作}。这当然是,除非你知道如何解决这个问题,然后通过各种方式为你提供更多的权力。我不认为v1技术对你有好处。

修改

public class MainActivity extends Activity {
    ListView lmenu;
    View v1;
    String s;
    Class<?> ourclass;
    View layout, row;
    static int trantype;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);
        setContentView(R.layout.menulist);

        Menu Menu_data[] = new Menu[] { new Menu("1.White"),
                new Menu("2.Blue"), new Menu("3.Purple"), new Menu("4.Red"),
                new Menu("5.Yellow"), new Menu("6.Black"), new Menu("6.Black"),
                new Menu("6.Black"), new Menu("6.Black"), new Menu("6.Black"),
                new Menu("6.Black"), new Menu("6.Black") };

        MenuAdapter adapter = new MenuAdapter(this, R.layout.menutext, Menu_data);
        lmenu = (ListView) findViewById(R.id.mainmenu);
        lmenu.setAdapter(adapter);
    }

    public class Menu {
        public String title;

        public Menu() {
            super();
        }

        public Menu(String title) {
            super();
            this.title = title;
        }
    }

    public class MenuAdapter extends ArrayAdapter<Menu> {

        Context context;
        int layoutResourceId;
        Menu data[];
        LayoutInflater inflater;
        boolean[] arrBgcolor;
        private int activeHex, inactiveHex;

        public MenuAdapter(Context context, int layoutResourceId, Menu[] data) {
            super(context, layoutResourceId, data);
            this.layoutResourceId = layoutResourceId;
            this.context = context;
            this.data = data;


            activeHex = Color.parseColor("#FCD5B5");
            inactiveHex = Color.parseColor("#EEEEEE");

            inflater = (LayoutInflater) context
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            arrBgcolor = new boolean[data.length];
            resetArrbg();
        }

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

            final MenuHolder holder;
            row = convertView;
            // convertView.setBackgroundColor(Color.BLACK);
            if (row == null) {
                row = inflater.inflate(layoutResourceId, parent, false);
                holder = new MenuHolder();
                holder.txtTitle = (TextView) row.findViewById(R.id.tv1);
                row.setTag(holder);
            } else {
                holder = (MenuHolder) row.getTag();
            }

            Menu Menu = data[position];
            holder.txtTitle.setText(Menu.title);


            if (arrBgcolor[position]) {
                row.setBackgroundColor(activeHex);
            } else {
                row.setBackgroundColor(inactiveHex);
            }

            holder.txtTitle.setOnClickListener(new OnClickListener() {

                public void onClick(View v) {
                    resetArrbg();
                    arrBgcolor[position] = true;
                    notifyDataSetChanged();
                }
            });

            return row;
        }

        private void resetArrbg() {
            for (int i = 0; i < arrBgcolor.length; i++) {
                arrBgcolor[i] = false;
            }
        }

        public class MenuHolder {
            TextView txtTitle;
        }
    }
}