Android 当触摸行的任何UI元素时,高亮显示Listview行
我使用Listview中的基本适配器来扩展列表视图,它们是两个小部件Textview和EdittextAndroid 当触摸行的任何UI元素时,高亮显示Listview行,android,Android,我使用Listview中的基本适配器来扩展列表视图,它们是两个小部件Textview和Edittext Listview已正确充气,并且正在显示。我们的要求是,当用户单击任何一行时,该行必须是彩色或高亮显示的。当用户单击另一行时,该行高亮显示。和上一行颜色变为正常。最好的方法是请求将焦点放在视图上,即在适配器中执行此覆盖方法getView: @Override public View getView(final int position, View convert
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)
。如果您想保留文本输入seitEditText.setOnFocusChanged()
-的可能性,并将孔列表项标记为选中。谢谢Jim,您能解释一下我必须做什么才能在列表视图的编辑文本上设置click listener。这样我的问题就解决了。我不明白,当我点击其中任何一个时,我有3个文本视图,但当我点击编辑文本时,没有什么会发生,因为这样一个精彩的解释。我正在扩展活动,这就是为什么@Override protected void onListItemClick方法的任何替代方法,以及您为列表视图设置单击侦听器的位置。