根据变量更改单个列表视图中的文本颜色

时间:2014-05-13 11:28:17

标签: android json parsing

我按照本教程关于解析JSON。一切正常,因为它本应编辑它以满足我的需求。我正在获取有关服务器'的信息。其中一个领域是' status' (UP或DOWN)。

编辑:忘记发布教程链接http://www.androidhive.info/2012/01/android-json-parsing-tutorial/

目前看起来像这样:http://puu.sh/8Ky0B.jpg 以上是应用程序加载后会发生的事情。点击是指单击一个项目时,它会启动一个新活动并单独显示该信息。

您可以看到第二个服务器状态为' DOWN'。基于此,我想将文本颜色更改为RED以使其保持绿色状态。

如何通过并添加每个列表视图?

这是(当前)与教程基本相同的代码:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    serverList = new ArrayList<HashMap<String, String>>();

    ListView lv = getListView();

    // Listview on item click listener
    lv.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view,
                int position, long id) {
            // getting values from selected ListItem
            String name = ((TextView) view.findViewById(R.id.name))
                    .getText().toString();
            String ip = ((TextView) view.findViewById(R.id.ipAddress))
                    .getText().toString();
            String status = ((TextView) view.findViewById(R.id.serverStatus))
                    .getText().toString();

            // Starting single server activity
            Intent in = new Intent(getApplicationContext(),
                    SingleContactActivity.class);
            in.putExtra(TAG_NAME, name);
            in.putExtra(TAG_IP, ip);
            in.putExtra(TAG_STATUS, status);
            startActivity(in);
        }
    });

    // Calling async task to get json
    new GetContacts().execute();
}

/**
 * Async task class to get json by making HTTP call
 * */
private class GetContacts extends AsyncTask<Void, Void, Void> {

    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        // Showing progress dialog
        pDialog = new ProgressDialog(MainActivity.this);
        pDialog.setMessage("Please wait...");
        pDialog.setCancelable(false);
        pDialog.show();
    }

    @Override
    protected Void doInBackground(Void... arg0) {
        // Creating service handler class instance
        ServiceHandler sh = new ServiceHandler();

        // Making a request to url and getting response
        String jsonStr = sh.makeServiceCall(url, ServiceHandler.GET);

        Log.d("Response: ", "> " + jsonStr);

        if (jsonStr != null) {
            try {
                JSONArray jArray = new JSONArray(jsonStr);

                // looping through All Servers
                for (int i = 0; i < jArray.length(); i++) {
                    JSONObject c = jArray.getJSONObject(i);

                    String id = c.getString(TAG_ID);
                    String name = c.getString(TAG_NAME);
                    String ip = c.getString(TAG_IP);
                    String status = c.getString(TAG_STATUS);

                    // tmp hashmap for single server
                    HashMap<String, String> contact = new HashMap<String, String>();

                    contact.put(TAG_ID, id);
                    contact.put(TAG_NAME, name);
                    contact.put(TAG_IP, ip);
                    contact.put(TAG_STATUS, status);

                    // adding server to server list
                    serverList.add(contact);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } else {
            Log.e("ServiceHandler", "Couldn't get any data from the url");
        }
        return null;
    }

    @Override
    protected void onPostExecute(Void result) {
        super.onPostExecute(result);
        // Dismiss the progress dialog
        if (pDialog.isShowing())
            pDialog.dismiss();
        /**
         * Updating parsed JSON data into ListView
         * */

        ListAdapter adapter = new SimpleAdapter(
                MainActivity.this, serverList,
                R.layout.list_item, new String[] { TAG_NAME, TAG_IP,
                        TAG_STATUS }, new int[] { R.id.name,
                        R.id.ipAddress, R.id.serverStatus });

        setListAdapter(adapter);
    }

}

4 个答案:

答案 0 :(得分:1)

您需要制作自定义适配器,并且在getView()中您应检查服务器的状态是否已关闭,然后将相应textview的颜色设置为红色,否则将其设置为绿色。

你的getView()应如下所示:(这只是你代码的蓝图)

getView(){
     String serverstatus = server.getStatus();
    // get status should be method in method in model class for server.
    if(serverstatus.equals("DOWN")){
       tv.setTextColor(Color.RED);
    }else{
       tv.setTextColor(Color.GREEN);
    }
}

修改

  1. 制作模特课。
  2. class Server{
       String serverName, serverIp, serverStatus;
          // getter and setter.
      }
    
    1. 制作Server类型的数组适配器。

    2. 在Adapter的getView()中,对行项目进行充气,并设置详细信息。因为,已经添加了红色字体蓝图。

答案 1 :(得分:0)

在list的定义中,在getView()方法中,找到textview并更改文本颜色。

TextView tv = (TextView) listItem.findViewById(R.id.server_status);
tv.setTextColor(android.R.color.primary_text_dark);

答案 2 :(得分:0)

使用自定义适配器(BaseAdapter)代替简单适配器,

然后在getView()方法中执行操作。

答案 3 :(得分:0)

你已经完成了大部分的艰苦工作:)

首先创建一个存储服务器详细信息的对象而不是HashMap(缓慢而沉重),另外一个对象更具适应性,更适合您的目的。

我已经创建了一个超级快速的示例(不完整的详细信息,但应该很容易扩展)。

package com.example.adaptertest;

public class HolderServer {

String serverName;
boolean isServerUp;

public HolderServer(String serverName, boolean isServerUp) {
    this.serverName = serverName;
    this.isServerUp = isServerUp;
}

public String getServerName() {
    return serverName;
}

public void setServerName(String serverName) {
    this.serverName = serverName;
}

public boolean isServerUp() {
    return isServerUp;
}

public void setServerUp(boolean isServerUp) {
    this.isServerUp = isServerUp;
}
}

接下来,您需要创建自定义适配器。在你的例子中,你实际上使用的是一个简单的适配器(ListAdapter adapter = new SimpleAdapter(),这是一个很好的第一步,但是我们可以通过扩展它来改进它。这将允许我们改变每个列表视图中的单个元素。即改变颜色等。

这是一个简单的例子:

package com.example.adaptertest;

import java.util.ArrayList;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

public class AdapterServers extends ArrayAdapter<HolderServer>{

ArrayList<HolderServer> mServers = new ArrayList<HolderServer>();
private LayoutInflater mInflater;
Context mContext;

public AdapterServers(Context context, int resource, ArrayList<HolderServer> servers) {
    super(context, resource, servers);
    mInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    mContext = context;
    mServers = servers;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    //Inflate view for each element in list.
    convertView = mInflater.inflate(R.layout.server_list_item, null);

    //Get details for current server
    HolderServer server = mServers.get(position);

    //Set server name
    ((TextView) convertView.findViewById(R.id.server_list_item_txt_servername)).setText(server.getServerName());

    //Now we set the status text and color 
    TextView status = (TextView) convertView.findViewById(R.id.server_list_item_txt_serverstatus);
    if(server.isServerUp){
        status.setText(mContext.getResources().getString(R.string.up));
        status.setTextColor(mContext.getResources().getColor(R.color.green));
    }else{
        status.setText(mContext.getResources().getString(R.string.down));
        status.setTextColor(mContext.getResources().getColor(R.color.red));
    }

    return convertView;
}
}

现在回到你的代码中,首先在onCreate中创建一个新的对象列表:

ArrayList<HolderServer> mServerList = new ArrayList<HolderServer>();

然后代替:

                // tmp hashmap for single server
                HashMap<String, String> contact = new HashMap<String, String>();

                contact.put(TAG_ID, id);
                contact.put(TAG_NAME, name);
                contact.put(TAG_IP, ip);
                contact.put(TAG_STATUS, status);

您将创建新对象&amp;将其添加到列表中。一旦你的HolderServer对象被更新,显然会用你的变量更新它:

    HolderServer server = new HolderServer("Server1", true);
    serverList.add(server);

然后将该列表应用于适配器并将适配器应用于列表视图:

    AdapterServers adapter = new AdapterServers(this, 0, serverList);
    ((ListView) findViewById(R.id.fragment_main_listview)).setAdapter(adapter);
祝你好运!