我正在使用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);
}
});
}
感谢您的帮助!
答案 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);
}
});
}