将listview的背景颜色更改为其他颜色

时间:2018-04-04 11:41:34

标签: android listview android-arrayadapter

我正在使用Android中的应用程序,我关闭了所有服务器。因此,我使用ArrayAdapter和Listview。

在后台进程中,我遍历IP - 地址并关闭所有服务器。

现在,我希望迭代我的服务器为ListView中的每一行着色为绿色(意味着仍在使用它来关闭它)或者在服务器关闭后立即为红色。

我可以在扩展ArrayAdapter时以不同的颜色为每一行着色,然后在getView方法中对它们进行不同的着色。

但是,如果在后台进程中迭代每一行,我怎么能这样做呢?

在我的Activity类调用期间设置了我的适配器。

我是否必须将setAdapter方法放在我的后台进程中,或类似的东西?

这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
    initComponents();
}
private void initComponents() {
    model = new SharedPreferenceModel(getBaseContext());
    mydb = new DatabaseHelper(this);
    array_list = mydb.getAllCotacts();
    hostsOnline = new ArrayList<String>();

    btnShutdown = findViewById(R.id.btnShutdown);
    lv = (ListView) findViewById(R.id.listView);
    CustomArrayAdapter custom = new CustomArrayAdapter(this, android.R.layout.simple_list_item_1, array_list);
    lv.setAdapter(custom);
}

private void addListeners(final ShutdownServers shutdownServers) {
    btnShutdown.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
        new AsyncTask<Integer, String, Void>() {
            @Override
            protected Void doInBackground(Integer... params) {
                try {
                    for(int i = 0; i<array_list.size(); i++){
                        posInArray++;
                        String host = array_list.get(i);
                        if(host.equals("192.168.1.1"))
                            publishProgress("Shutdown " + host);
                        else
                            executeRemoteCommand(getBaseContext(), host);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
            protected void onProgressUpdate(String... values) {
                hostsOnline.add(values[0]);
                custom.setNotifyOnChange(true);
                custom.notifyDataSetChanged();
            }
        }.execute(1);
        }
    });
}

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

您可以使用setNotifyOnChange(boolean)方法和相应的add(),删除等方法来控制列表状态(添加,删除,更改项目)。请记住,支持数组字段的更改状态不会自动触发UI更改。如果要手动控制更改,可以使用ArrayAdapter的notifyDataSetChanged()方法。

这一切都是因为ArrayAdapter尝试仅实例化一次视图,并在向下滚动时将它们重用于不同的数组元素。视图的状态应该只在getView()中修改,通常每个数组元素只调用一次,当它第一次在屏幕上渲染时。但是,您可以强制重绘&#39;使用notifyDataSetChanged()随时保持UI状态与后备数组字段一致。

答案 1 :(得分:0)

lv.setBackgroundResource(R.drawable.your file)// from drawable
lv.setBackgroundResource(Color.BLACK)// from color by default

答案 2 :(得分:0)

现在我能够解决着色问题。这是我的解决方案:

public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    // Get the current item from ListView
    View view = super.getView(position,convertView,parent);

    if(notifyCalling==1 && position == getPos()){
        Log.d("getView - if - position", String.valueOf(position));
        view.setBackgroundColor(Color.GREEN);
    }else if(notifyCalling ==1 && position < getPos()){
        Log.d("getView - elseif - position", String.valueOf(position));
        view.setBackgroundColor(Color.RED);
    }else if (position % 2 == 1) {
            view.setBackgroundColor(Color.LTGRAY);
        } else {
            view.setBackgroundColor(Color.WHITE);
        }
    return view;
}

private void addListeners(final ShutdownServers shutdownServers) {
    btnShutdown.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            btnShutdown.setClickable(false);
        new AsyncTask<Integer, String, Void>() {
            @Override
            protected Void doInBackground(Integer... params) {
                try {
                    for(int i = 0; i<array_list.size(); i++){
                        String host = array_list.get(i);
                        publishProgress(host);
                        executeRemoteCommand(getBaseContext(), host);
                        setIndex(i+1);
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
                return null;
            }
            protected void onProgressUpdate(String... values) {
                custom.setNotifyOnChange(true);
                custom.notifyDataSetChanged(getIndex());
            }
        }.execute(1);
        }
    });
}