如果找到MATCH,则更改ListView项目的背景颜色(Android ListView)

时间:2016-07-20 08:30:57

标签: android listview arraylist

我有两个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>

4 个答案:

答案 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

这是我模拟器中的最终结果: screenshot

注意:我使用了一些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 ;

两个字符串之间存在'的差异,因此它们不相等。