Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 更改列表项选择的视图属性_Android_Listview_Focus - Fatal编程技术网

Android 更改列表项选择的视图属性

Android 更改列表项选择的视图属性,android,listview,focus,Android,Listview,Focus,我有一个包含自定义行的ListView。此自定义行具有以下UI元素 图像视图图像视图1、图像视图2 文本视图文本视图1、文本视图2、文本视图3 要求是,只要选择列表行,就会有以下更改 imageView1背景,颜色已更改 imageView1颜色已更改 textview1颜色、大小和字体正在更改 textview2颜色、大小已更改 textview3颜色、大小已更改 什么是最好的设计方法 抱歉,我们无法在选择器中应用样式。有没有比在java代码中处理更好的方法 我们有setOnItemSelec

我有一个包含自定义行的ListView。此自定义行具有以下UI元素

  • 图像视图图像视图1、图像视图2
  • 文本视图文本视图1、文本视图2、文本视图3
  • 要求是,只要选择列表行,就会有以下更改

    imageView1背景,颜色已更改

    imageView1颜色已更改

    textview1颜色、大小和字体正在更改

    textview2颜色、大小已更改

    textview3颜色、大小已更改

    什么是最好的设计方法


    抱歉,我们无法在选择器中应用样式。有没有比在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状态。(我会使用轨迹球而不是