Android 当触摸行的任何UI元素时,高亮显示Listview行

Android 当触摸行的任何UI元素时,高亮显示Listview行,android,Android,我使用Listview中的基本适配器来扩展列表视图,它们是两个小部件Textview和Edittext Listview已正确充气,并且正在显示。我们的要求是,当用户单击任何一行时,该行必须是彩色或高亮显示的。当用户单击另一行时,该行高亮显示。和上一行颜色变为正常。最好的方法是请求将焦点放在视图上,即在适配器中执行此覆盖方法getView: @Override public View getView(final int position, View convert

我使用Listview中的基本适配器来扩展列表视图,它们是两个小部件Textview和Edittext


Listview已正确充气,并且正在显示。我们的要求是,当用户单击任何一行时,该行必须是彩色或高亮显示的。当用户单击另一行时,该行高亮显示。和上一行颜色变为正常。

最好的方法是请求将焦点放在视图上,即在适配器中执行此覆盖方法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;
        }
@覆盖
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
convertView.requestFocus();
}
});
返回视图;
}

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

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

首先,您需要两个图像来显示ListView项的高亮度和正常状态。然后需要为ListView使用自定义行。假设它有一个文本视图

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

现在,在使用自定义适配器时,可以在getView()中检查int变量==position。如果相同,则将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;
    }
}
公共类MySampleActivity扩展了ListActivity
{
ArrayList lst_string=新的ArrayList();
int selected_item=-1;
MyListAdapter-adptr;
/**在首次创建活动时调用*/
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
lst_字符串添加(“第1项”);
lst_字符串添加(“第2项”);
lst_字符串添加(“第3项”);
lst_字符串添加(“第4项”);
lst_字符串添加(“第5项”);
lst_字符串添加(“第6项”);
lst_字符串添加(“第7项”);
添加第1个字符串(“第8项”);
lst_字符串添加(“第9项”);
adptr=新的MyListAdapter();
setListAdapter(adptr);
}
@凌驾
受保护的void onListItemClick(列表视图l、视图v、整数位置、长id)
{
所选项目=位置;
adptr.notifyDataSetChanged();
}
私有类MyListAdapter扩展BaseAdapter
{
@凌驾
public int getCount()
{
返回lst_string.size();
}
@凌驾
公共对象getItem(int位置)
{
返回位置;
}
@凌驾
公共长getItemId(int位置)
{
返回位置;
}
私人停车场;
公共MyListAdapter()
{
mInflater=(LayoutInflater)getSystemService(Context.LAYOUT\u INFLATER\u SERVICE);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
ViewHolder=null;
if(convertView==null)
{
convertView=mInflater.充气(R.layout.list_行,空);
holder=新的ViewHolder();
holder.textView=(textView)convertView.findViewById(R.id.tv_行);
convertView.setTag(支架);
} 
其他的
{
holder=(ViewHolder)convertView.getTag();
}
holder.textView.setText(lst_string.get(position));
如果(所选项目==位置)
{
holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_selected));
}
其他的
{
holder.textView.setBackgroundDrawable(getResources().getDrawable(R.drawable.list_normal));
}
返回视图;
}
}
公共静态类视图持有者
{
公共文本视图文本视图;
}
}

谢谢吉姆,这对我有用。我在Listview中有四个视图,3个是Textview,1个是Edittext。Listener在Textview上设置,颜色正在更改,但当我单击Edittext时,颜色没有更改。编辑文本上的侦听器未设置。这是因为
EditText
捕获触摸事件并自行执行操作(如显示键盘等)。如果您想禁止在EditText中输入文本,只需执行
setClickable(false)
。如果您想保留文本输入seit
EditText.setOnFocusChanged()
-的可能性,并将孔列表项标记为选中。谢谢Jim,您能解释一下我必须做什么才能在列表视图的编辑文本上设置click listener。这样我的问题就解决了。我不明白,当我点击其中任何一个时,我有3个文本视图,但当我点击编辑文本时,没有什么会发生,因为这样一个精彩的解释。我正在扩展活动,这就是为什么@Override protected void onListItemClick方法的任何替代方法,以及您为列表视图设置单击侦听器的位置。