【发布时间】: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>
这不是我尝试过的唯一方法。我还关注了其他问题,例如:
- 显示的方法,仍然一次更改了所有项目here
- 向我的 xml 文件添加第二个 textview 并使用它自己的 ID 和不同的背景颜色,然后有条件地将 arrayAdapter 设置为适当的 ID。它仍然将所有内容更改为相同的颜色,但这次颜色从未改变
- 移动 arrayadapater 并遵循解码函数中的声明。这导致了崩溃。
- 使用布尔变量,仍然更改整个列表视图而不是单个项目
- 使用 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 < 1 ) { productname.setTextColor(white); productcost.setTextColor(white); ...这是initView -
@MikeT 感谢您的帮助。我试试看
标签: java android listview arraylist android-arrayadapter