触摸任何UI元素行时突出显示Listview行

时间:2011-12-12 05:08:57

标签: android

我使用Base适配器对列表视图进行充气在Listview中,它们是两个小部件Textview和Edittext。

Listview充分充气并且也在显示。我们的要求是当用户点击该行必须为彩色或突出显示的任何一行时。当用户点击该行突出显示的其他行时。和之前的行颜色变得正常。

2 个答案:

答案 0 :(得分:1)

执行此操作的最佳方法是请求关注视图,触摸后,在适配器中执行此覆盖方法getView:

        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            <prepare or create view here>
            convertView.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    convertView.requestFocus();
                }
            });
            return convertView;
        }

要为不同的状态提供不同的颜色,您可以使用 selector 背景资源。

答案 1 :(得分:1)

嗯,很简单。我就是这样做的。

首先,您需要两个图像来显示ListView项的高位和正常状态。然后,您需要为ListView使用自定义行。可以说它里面有一个TextView。

在Activity中保留一个整数变量。此整数将保留ListView的选定索引。最初将其指定为-1值。

现在,当您使用自定义适配器时,您可以检查getView()是否为int变量== postition。如果相同,请将TextView的背景设置为突出显示,否则,正常。并覆盖OnListItemClick()。在此,保存该int变量中的位置并调用notifyDataSetChanged()。以下是此示例代码:

public class MySampleActivity extends ListActivity 
{
    ArrayList<String> lst_string = new ArrayList<String>();
    int selected_item = -1;
    MyListAdapter adptr;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        lst_string.add("item 1");
        lst_string.add("item 2");
        lst_string.add("item 3");
        lst_string.add("item 4");
        lst_string.add("item 5");
        lst_string.add("item 6");
        lst_string.add("item 7");
        lst_string.add("item 8");
        lst_string.add("item 9");

        adptr = new MyListAdapter();
        setListAdapter(adptr);
    }

    @Override
    protected void onListItemClick(ListView l, View v, int position, long id)
    {
        selected_item = position;
        adptr.notifyDataSetChanged();
    }

    private class MyListAdapter extends BaseAdapter
    {
        @Override
        public int getCount()
        {
            return lst_string.size();
        }

        @Override
        public Object getItem(int position)
        {
            return position;
        }

        @Override
        public long getItemId(int position)
        {
            return position;
        }

        private LayoutInflater mInflater;

        public MyListAdapter() 
        {
            mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) 
            {
                convertView = mInflater.inflate(R.layout.list_row, null);
                holder = new ViewHolder();
                holder.textView = (TextView)convertView.findViewById(R.id.tv_row);
                convertView.setTag(holder);
            } 
            else 
            {
                holder = (ViewHolder)convertView.getTag();
            }
            holder.textView.setText(lst_string.get(position));
            if(selected_item == position)
            {
                holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_selected));
            }
            else
            {
                holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_normal));
            }
            return convertView;
        }
    }

    public static class ViewHolder 
    {
        public TextView textView;
    }
}