【问题标题】:How can individual item colors be changed upon addition in a listview based on variables in a void function?如何在基于 void 函数中的变量的列表视图中添加单个项目颜色?
【发布时间】:2017-09-12 21:47:07
【问题描述】:

我正在开发一个与蓝牙设备交互的应用。蓝牙设备发送一串数据,其中包括信号强度、通过/下降测试结果和设备 ID,以空格分隔。我有一个 void 函数,它解码数据字符串并将解码的字符串添加到 ArrayList,将解码的数据放入适当的变量中,并将最新的数据放入不同的 textView。我想根据从蓝牙字符串解码的“通过”变量的结果更改 textView 颜色。我还想根据通过/失败结果更改 listView 项目的颜色,但是我尝试的每种方法都会更改 listView 中的所有项目,或者导致我的应用程序崩溃。

如何根据来自不同 void 函数的解码数据单独更改项目的 listView 颜色?

这些代码块来自我的 java 活动: 来自 onViewCreated:

mReadingLog  = (ListView) view.findViewById(R.id.scanLogView);

        adapter = new ArrayAdapter<String>(getActivity(), R.layout.listview_layout, R.id.testResults, listItems) {
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {

                View view = super.getView(position, convertView, parent);

                listItemShow = (TextView) view.findViewById(R.id.testResults);

                if(didPass==1){
                    listItemShow.setBackgroundColor(Color.GREEN);
                }else {
                    listItemShow.setBackgroundColor(Color.RED);
                }


                return view;
            }
        };//9/11/17

来自我的解码功能:

  listItems.add(
            "Device: " + mConnectedDeviceName +
                    System.getProperty("line.separator") +
                    "Timestamp: " + currentDateandTime +
                    System.getProperty("line.separator") +
                    "Location: " + latitude + " (lat) / " + longitude + " (lon)" +
                    System.getProperty("line.separator") +
                    "Phone id: "  + telephonyManager.getDeviceId() +
                    System.getProperty("line.separator") +
                    "Valid:" + (passed ? "YES" : "NO") +
                    System.getProperty("line.separator") +
                    "Values: " + "T" + v1 + " / " + v2 +
                    System.getProperty("line.separator") +
                   // "=========================" +
                    System.getProperty("line.separator"));//9/11/17


    clickCounter++;//9/11/17


    mShowData.setText(saveData); //kg 8/25/17
    if(passed == true) {
        mShowData.setBackgroundColor(Color.GREEN);
        didPass = 1;

    } else if (passed == false){
        mShowData.setBackgroundColor(Color.RED);
        didPass = 0;


    } else {
        mShowData.setBackgroundColor(Color.WHITE);


    }
    adapter.notifyDataSetChanged();//9/11/17

listview_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:padding="15dp"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <TextView
        android:id="@+id/testResults"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>


</LinearLayout>

view_list.xml:

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
              android:orientation="vertical"
              android:id="@+id/viewList"
              android:layout_width="match_parent"
              android:layout_height="match_parent">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="fill_parent"
        android:layout_gravity="center_horizontal"
        android:paddingLeft="4dp"
        android:paddingRight="4dp"
        android:visibility="visible">


        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:id="@+id/button_holder"
            android:orientation="horizontal">

            <Button
                android:id="@+id/flipperReturn"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="Return"/>

            <Button
                android:id="@+id/button_clear_log"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_weight="1"
                android:text="@string/clear_log"/>

        </LinearLayout>

        <LinearLayout
            android:id="@+id/listview_holder"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_above="@id/button_holder"
            android:layout_alignParentTop="true"
            android:orientation="vertical">


            <ListView
                android:id="@+id/scanLogView"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:layout_gravity="center_horizontal"
                android:divider="@android:color/black"
                android:dividerHeight="1dp"
                android:footerDividersEnabled="false"
                android:headerDividersEnabled="false"
                android:maxLines="4096"
                android:paddingTop="15dp"
                android:scrollbars="vertical"
                android:text="@string/app_name"
                android:textAppearance="?android:attr/textAppearanceSmall"/>

        </LinearLayout>


    </RelativeLayout>


</LinearLayout>

这不是我尝试过的唯一方法。我还关注了其他问题,例如:

  1. 显示的方法,仍然一次更改了所有项目here
  2. 向我的 xml 文件添加第二个 textview 并使用它自己的 ID 和不同的背景颜色,然后有条件地将 arrayAdapter 设置为适当的 ID。它仍然将所有内容更改为相同的颜色,但这次颜色从未改变
  3. 移动 arrayadapater 并遵循解码函数中的声明。这导致了崩溃。
  4. 使用布尔变量,仍然更改整个列表视图而不是单个项目
  5. 使用 android.R.layout.simple_list_item_1、android.R.id.text1 而不是自定义列表视图。

我做错了什么?有没有人有一个链接到一个描述如何做到这一点的教程?我检查了下面的所有回复,但我实施的所有回复都没有按描述工作,也没有真正遇到与我相同的问题。

【问题讨论】:

  • @PhilipWhitehouse 是否可以在不创建自定义列表视图的情况下执行此操作?我刚开始学习 java 编程,创建自定义列表视图对我来说是全新的,它似乎远远超出了我的能力范围
  • @KyleG,我的第一个 ListView 使用了 Cursom adpater,它们并没有那么困难,而且它们确实提供了很大的灵活性,例如根据内容更改颜色。例如我有int numberrequired = csr.getInt(shoplist_numbertoget_offset) - csr.getInt(shoplist_done_offset); 然后稍后if (numberrequired &lt; 1 ) { productname.setTextColor(white); productcost.setTextColor(white); ... 这是initView
  • @MikeT 感谢您的帮助。我试试看

标签: java android listview arraylist android-arrayadapter


【解决方案1】:

需要实现ArrayAdapter的getView(int position, View convertView, ViewGroup parent)。

从 ArrayAdapter 派生一个类,实现 getView 以根据您的需要返回稍微不同的视图,并使用您的新 ArrayAdapter 类。

【讨论】:

  • 使用 getView 需要创建自定义布局,对吗?
  • 是的,但它可以像水平布局中的标签一样简单。
  • 感谢您的帮助。我希望有另一种方法来制作自定义布局,因为这对我的应用程序的功能来说并不是必不可少的,只是一些额外的东西,而且我现在的能力非常有限
  • 我遵循了 getview 指南 here 来尽量保持简单,它适用于更改背景颜色,但我想根据变量有条件地更改背景颜色不同的功能。这仍然是正确的方法吗?
  • 是的,这个例子很好。在 getView 代码中,您必须以某种方式添加数据/和/或代码以允许您计算颜色。例如,如果它是奇数/偶数行,您可以计算它。或者您可能必须向支持 ArrayAdapter 的数组添加数据,以指示每个组件应采用哪种颜色。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 2018-09-06
  • 1970-01-01
相关资源
最近更新 更多