Android 更改列表项选择的视图属性
我有一个包含自定义行的ListView。此自定义行具有以下UI元素Android 更改列表项选择的视图属性,android,listview,focus,Android,Listview,Focus,我有一个包含自定义行的ListView。此自定义行具有以下UI元素 图像视图图像视图1、图像视图2 文本视图文本视图1、文本视图2、文本视图3 要求是,只要选择列表行,就会有以下更改 imageView1背景,颜色已更改 imageView1颜色已更改 textview1颜色、大小和字体正在更改 textview2颜色、大小已更改 textview3颜色、大小已更改 什么是最好的设计方法 抱歉,我们无法在选择器中应用样式。有没有比在java代码中处理更好的方法 我们有setOnItemSelec
抱歉,我们无法在选择器中应用样式。有没有比在java代码中处理更好的方法 我们有setOnItemSelectedListener,可以在Listview上设置,该Listview将具有以下回调方法: i) 被选中 ii)无选择 但是,没有回调方法提供失去焦点的项的详细信息。这是一个更好的改变的地方吗
提前谢谢。我有一个简单的方法。。。但这是非常沉重的过程。。。
选择项目后,请刷新列表视图。。。仅对于所选项目,它应显示特定字体等。。。并将所选项目的id存储在某个变量中以匹配它,同时填充适配器中的视图…在活动级别获取一个静态整数变量
selectedPos
在onItemSelected中设置变量selectedPos=position
,在onNothingSelected中设置为-1
,并为适配器对象调用notifyDataSetChanged()
现在在ListView的适配器类中。
将getView中的条件写入为
if(position == selectedPos)
{
// set color and background to view
}
别忘了在adapter类中编写这两个方法
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public int getViewTypeCount() {
return _ArrayListObject.size();
}
霍特曼
我不知道你说的最有效的方法是什么意思。有很多方法都是非常快速的,但这通常取决于你提前知道什么和不知道什么。还必须理解的是,动态视图属性被严重误解,尽管存在流行的神话,但它仍然非常高效。谷歌的工作人员在用户界面开发方面做得非常出色
如果您提前知道它,您只需为每个视图创建一个StateListDrawable,并在运行适配器时将其应用于每个视图
要构建StateListDrawable,请创建一个:
StateListDrawable _drawStates;
然后,对于每个状态,添加所需的可绘制图形:
_drawStates.add(new int[] {android.R.attr.state_pressed}, _newImage);
这与适配器的getView()方法中的以下行一样简单:
v.setBackgroundDrawable(_drawStates);
或者,您可以根据选择动态更改背景。这可以在OnListItemClick()
中完成。您可以看到,OnListItemClick()
将为您提供已单击的确切视图。一旦你有了这个,你就可以通过它的id
来找到这个孩子,并改变它的属性和invalidate()
它。我经常使用这个技巧。为我节省了大量内存,但我没有做任何真正需要处理器的事情。您几乎可以在这里更改任何属性,而无需进行任何处理。以下是一个例子:
@Override protected void onListItemClick(final ListView inList, final View v, final int atPos, final long rowID)
{//Get the Child, set the properties
ImageView _img = (ImageView)(v.findViewById(R.id.app_package));
_img.setBackgroundColor(myClickedColor);
_img.invalidate(); // <---- BEST Option
// ... OR ...
v.invalidate(); // <---- 2nd Best Option
// ... OR ...
inList.invalidate(); // <---- Last resort or specialized implementation
}
@覆盖受保护的void onListItemClick(列表中的最终列表视图、最终视图v、最终int atPos、最终长行ID)
{//获取子对象,设置属性
ImageView _img=(ImageView)(v.findViewById(R.id.app_包));
_img.setBackgroundColor(myClickedColor);
_img.invalidate();//我认为您在这里要做的是创建一个。您可以在samples//ApiDemos子目录中的SDK目录中找到一个示例(如果没有这些目录,您可能需要下载)
我要做的是创建一个类,该类继承用于自定义行的任何类型的布局。在本例中,我们假设它是LinearLayout
。在子类构造函数中,您可以从资源中展开布局,找到子视图并将其附加到实例变量,然后将LinearLayout返回到ca米勒
在这个子类中,您可以覆盖setSelected
并以任何方式操作子视图
以下是我根据你的帖子描述的一个例子:
public class MyCustomLayout extends LinearLayout {
public ImageView imageView1; // These are public since you likely want
public ImageView imageView2; // to set them in your Adapter.
public TextView textView1;
public TextView textView2;
public TextView textView3;
public MyCustomLayout(Context ctxt) {
super(ctxt);
// The call below attaches the items in the mycustomlayout.xml file to this
// instance, which serves as the root element in the layout.
LayoutInflater.from(ctxt).inflate(R.layout.mycustomlayout, this, true);
imageView1 = (ImageView)findViewById(R.id.imageview1);
imageView2 = (ImageView)findViewById(R.id.imageview2);
textView1 = (TextView)findViewById(R.id.textview1);
textView2 = (TextView)findViewById(R.id.textview2);
textView3 = (TextView)findViewById(R.id.textview3);
}
@Override
public void setSelected(boolean selected) {
super.setChecked(selected);
if (selected) {
imageView1.setBackgroundColor(0xFFFF0000); // whatever color you want
// Do all the rest of the setting of your subviews here for
// the case when the row is selected.
} else {
imageView1.setBackgroundColor(0xFF000000); // whatever color you want
// Do all the rest of the setting of your subviews here for
// the case when the row is not selected
}
}
}
现在,在mycustomlayout.xml文件中,您希望使用
标记,这样就不会创建不需要的布局:
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<ImageView
android:id="@+id/imageview1" />
<ImageView
android:id="@+id/imageview2" />
<TextView
android:id="@+id/textview1" />
<TextView
android:id="@+id/textview2" />
<TextView
android:id="@+id/textview3" />
</merge>
显然,我已经省略了上面所有子视图的配置,但是您应该了解如何设置XML文件。如果您不想玩弄XML和布局工具,也可以在代码中这样做。您可以在Android开发博客上查看,该博客最后讨论了一个类似的案例
然后,在适配器的getView
中,您只需创建(或回收)MyCustomLayout
的实例,设置它们,并让框架跟踪哪些行被选中,哪些行未被选中“好吧,我们不能在选择器中应用样式。有没有比在java代码中处理更好的方法?"如果您不能在选择器中执行此操作,除了在Java中如何执行?也许您可以覆盖默认选择器引用的样式属性?可以应用样式来更改背景色/可绘制。更改字体大小没有帮助。我是否需要为每个子视图指定选择器?在Java代码中,如我所述n、 在getView()内部。谢谢soni。但是这意味着为每个选定的项目重新绘制listView。这可以以任何方式避免吗?还应该在“基础数据已更改”时调用notifyDataSetChanged(),这里不是这种情况。framework不支持处理这种情况吗?@khotmanish nope.:):(…我脑子里就有这个想法,我想这会对你有用..谢谢你的回答模糊逻辑。但是StateListDrawable只会更改颜色/可绘制。它对更改字体大小没有多大帮助。而且我更感兴趣的是onSelect状态而不是onClicked状态。(我会使用轨迹球而不是