我有两个List ArrayList,它们有一些字符串值。另外,我有一个ListView和一个ArrayAdapter。提供给ArrayAdapter的数据来自ArrayList之一。
我想要实现的是:比较arrayLists和如果arrayLists中存在的两个元素相同,那么当生成ListView时,找到匹配项的listView项的背景应该是不同的颜色。
我尝试使用listview.getChildAt(i).setBackgroundColor(Color.Blue),但它不起作用。它给我 java.lang.NullPointerException:尝试在同一行上的空对象引用上调用虚方法'void android.view.View.setBackgroundColor(int)'。 如果有更好的方法可以将其发布在你的答案中。
private List<String> forexInstruments;
private ListView forexListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
String[] temp = new String[]{
"'" + "EURCAD" + "'",
"'" + "USDGPY" + "'",
"'" + "AUDUSD" + "'",
"'" + "USDCHF" + "'",
"'" + "EURGPY" + "'",
"'" + "6B 03-16" + "'",
"'" + "6E 03-16" + "'",
"'" + "CL 03-16" + "'",
"'" + "ZB 09-16" + "'"
};
//1st Array List
selectedGlobalInstruments = new ArrayList<>(Arrays.asList(temp));
//2nd Array List
forexInstruments = new ArrayList<>();
forexInstruments.add("EURCAD");
forexInstruments.add("USDGPY");
forexInstruments.add("AUDUSD");
forexInstruments.add("EURGBP");
forexInstruments.add("USDJPY");
forexInstruments.add("GBPUSD");
forexInstruments.add("EURGPY");
forexInstruments.add("USDCHF");
forexListView = (ListView) findViewById(R.id.listView);
final ArrayAdapter arrayAdapter = new ArrayAdapter(this,R.layout.list_item_layout,R.id.list_item_instrument_textview,forexInstruments);
forexListView.setAdapter(arrayAdapter);
//Comparing both the ArrayLists. If two elements ar eqaul then change background color
for(int j=0; j< selectedGlobalInstruments.size(); j++) {
String tempA = selectedGlobalInstruments.get(j);
Log.v("Selcted",selectedGlobalInstruments.get(j));
for(int i=0; i < forexListView.getCount(); i++)
{
String instrumentList = "'" + forexListView.getItemAtPosition(i).toString()+ "'";
Log.v("forexListview",instrumentList);
if (tempA.equals(instrumentList)) {
Log.v("Satisfied",instrumentList);
forexListView.getChildAt(i).setBackgroundColor(Color.BLUE);
arrayAdapter.notifyDataSetChanged();
}
}
}
list_item_layout.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/list_item_instrument_textview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:fontFamily="sans-serif-condensed"
android:textSize="18sp"
android:gravity="center_vertical"
android:minHeight="?android:attr/listPreferredItemHeight"
android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
android:textColor="#000000"
android:textStyle="bold"
android:layout_marginRight="10dp">
</TextView>
activity_main.xml中
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.shubhamhpcs.listviesttes.MainActivity">
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
</RelativeLayout>
答案 0 :(得分:1)
在我看来,Activity
不应该关注如何显示ListView
中的项目,让这个工作适用于适配器(您在{{1}中执行此操作没有创建onCreate
的行,导致崩溃)
所以我要做的是创建一个包含2个字段的类:ListView
,其中显示您的实际数据,以及String value
,指示该项目是否应显示自定义背景。该课程应如下所示:
boolean hasBackground
然后我会让public class ListItem {
public String value;
public boolean hasBackground = false;
public ListItem(String value, boolean background) {
this.value = value;
this.hasBackground = background;
}
}
包含forexInstruments
类型的元素。我会添加如下元素:ListItem
,其中forexInstruments.add(getDefaultItem("USDGPY"));
是返回getDefaultItem
且背景设置为ListItem
的方法。
false
在初始化列表后,必须对其进行更新,因此我创建了一种方法来查找这两个列表之间的公共元素,并为这些元素设置private ListItem getDefaultItem(String value) {
return new ListItem(value, false);
}
字段为hasBackground
。
true
最后,private void updateCommonElements() {
for (int j = 0; j < selectedGlobalInstruments.size(); j++) {
for (int i = 0; i < forexInstruments.size(); i++) {
String instrumentList = "'" + forexInstruments.get(i).value + "'";
if (selectedGlobalInstruments.get(j).equals(instrumentList)) {
forexInstruments.get(i).hasBackground = true;
}
}
}
}
看起来像这样:
onCreate
其中forexInstruments = new ArrayList<>();
forexInstruments.add(getDefaultItem("USDGPY"));
forexInstruments.add(getDefaultItem("AUDUSD"));
forexInstruments.add(getDefaultItem("EURGBP"));
forexInstruments.add(getDefaultItem("USDJPY"));
forexInstruments.add(getDefaultItem("GBPUSD"));
forexInstruments.add(getDefaultItem("EURGPY"));
forexInstruments.add(getDefaultItem("USDCHF"));
updateCommonElements();
forexListView = (ListView) findViewById(R.id.listView);
MyAdapter adapter = new MyAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1);
adapter.addAll(forexInstruments);
forexListView.setAdapter(adapter);
是一个扩展MyAdapter
的类,负责为行的背景着色。
ArrayAdapter
注意:我使用了一些Android默认布局,但可以在几秒钟内更改为布局。
答案 1 :(得分:0)
您需要通知适配器进行更改:
arrrayAdapter.notifyDataSetChanged();
答案 2 :(得分:0)
我认为你正在尝试在尚未完全设置时获取列表项。请检查以下是否有帮助:
ArrayAdapter arrayAdapter =null;
String[] temp = new String[]{
"'" + "EURCAD" + "'",
"'" + "USDGPY" + "'",
"'" + "AUDUSD" + "'",
"'" + "USDCHF" + "'",
"'" + "EURGPY" + "'",
"'" + "6B 03-16" + "'",
"'" + "6E 03-16" + "'",
"'" + "CL 03-16" + "'",
"'" + "ZB 09-16" + "'"
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
forexInstruments.add("EURCAD");
forexInstruments.add("USDGPY");
forexInstruments.add("AUDUSD");
forexInstruments.add("EURGBP");
forexInstruments.add("USDJPY");
forexInstruments.add("GBPUSD");
forexInstruments.add("EURGPY");
forexInstruments.add("USDCHF");
arrayAdapter.notifyDataSetChanged();
//Comparing both the ArrayLists. If two elements ar eqaul then change background color
checkSameItems();
}
private void init(){
//1st Array List
selectedGlobalInstruments = new ArrayList<>(Arrays.asList(temp));
//2nd Array List
forexInstruments = new ArrayList<>();
forexListView = (ListView) findViewById(R.id.listView);
arrayAdapter = new ArrayAdapter(this,R.layout.list_item_layout,R.id.list_item_instrument_textview,forexInstruments);
forexListView.setAdapter(arrayAdapter);
}
private void checkSameTimes(){
for(int j=0; j< selectedGlobalInstruments.size(); j++) {
String tempA = selectedGlobalInstruments.get(j);
Log.v("Selcted",selectedGlobalInstruments.get(j));
for(int i=0; i < forexListView.getCount(); i++)
{
String instrumentList = "'" + forexListView.getItemAtPosition(i).toString()+ "'";
Log.v("forexListview",instrumentList);
if (tempA.equals(instrumentList)) {
Log.v("Satisfied",instrumentList);
forexListView.getChildAt(i).setBackgroundColor(Color.BLUE);
arrayAdapter.notifyDataSetChanged();
}
}
}
}
答案 3 :(得分:0)
我认为你的琴弦不同,它们不会相等。 你的
selectedGlobalInstruments.get(0) = 'EURCAD';
您要初始化为:"'" + "EURCAD" + "'",
,同时:
forexInstruments.get(0) = EURCAD ;
两个字符串之间存在'
的差异,因此它们不相等。