Список изменений Android отображает дочерний цвет текста в зависимости от того, что он говорит
Я пытаюсь изменить цвет текстового представления, отображаемого в виде списка. Я хотел бы, чтобы это изменилось в зависимости от того, что говорится в тексте. Вы увидите, что я пытаюсь сделать это в методе onPostExecute. Цикл for не повторяется, потому что вызов getChild возвращает 0.
Вот мой класс:
private class GetJSON extends
AsyncTask<String, Integer, ArrayList<HashMap<String, String>>> {
ArrayList<HashMap<String, String>> AmmoList = new ArrayList<HashMap<String, String>>();
@Override
protected void onPreExecute() {
if (pDialog != null) {
pDialog.dismiss();
}
// Showing progress dialog before sending http request
pDialog = new ProgressDialog(AmmoDisplay.this);
pDialog.setMessage("Please wait..");
pDialog.setIndeterminate(true);
pDialog.setCancelable(false);
pDialog.show();
}
protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
ListAdapter adapter = new SimpleAdapter(AmmoDisplay.this, AmmoList,
R.layout.list_item, new String[] { TAG_DESC, TAG_STOCK,
TAG_PRICE, TAG_RD, TAG_HREF }, new int[] {
R.id.desc, R.id.stock, R.id.price, R.id.rd,
R.id.href });
setListAdapter(adapter);
ListView lv = getListView();
int childCount = lv.getCount();
for (int i = 0; i < childCount; i++) {
View v = lv.getChildAt(i);
TextView tv = (TextView) v.findViewById(R.id.stock);
String stockCol = tv.getText().toString();
System.out.println(stockCol);
if (stockCol == "in stock") {
tv.setTextColor(getResources().getColor(R.color.in_stock));
}
if (stockCol == "out of stock") {
tv.setTextColor(getResources().getColor(R.color.no_stock));
}
}
lv.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
String href = ((TextView) view.findViewById(R.id.href))
.getText().toString();
Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri
.parse(href));
startActivity(browserIntent);
}
});
if (pDialog != null) {
pDialog.dismiss();
}
}
@Override
protected ArrayList<HashMap<String, String>> doInBackground(
String... params) {
JSONParser jParser = new JSONParser();
JSONObject json = jParser.getJSONFromUrl(BASE_URL + AMMO);
try {
ammos = json.getJSONArray(TAG_AMMO);
for (int i = 0; i < ammos.length(); i++) {
JSONObject c = ammos.getJSONObject(i);
String stock = c.getString(TAG_STOCK);
String desc = c.getString(TAG_DESC);
String price = c.getString(TAG_PRICE);
String rd = c.getString(TAG_RD);
String href = c.getString(TAG_HREF);
HashMap<String, String> map = new HashMap<String, String>();
map.put(TAG_STOCK, stock);
map.put(TAG_DESC, desc);
map.put(TAG_PRICE, price);
map.put(TAG_RD, rd);
map.put(TAG_HREF, href);
AmmoList.add(map);
}
} catch (JSONException e) {
e.printStackTrace();
}
return AmmoList;
}
}
1 ответ
Не используйте SimpleAdapter
, Создайте пользовательский адаптер, который переопределяет getView
и сделайте любые манипуляции, которые вы хотите, чтобы цвет текста основывался на тексте текущего элемента.
Логика будет проще и понятнее, чем пытаться пройти список позже.
Увидеть /samples/android-8/ApiDemos/src/com/example/android/apis/view/List5.java
в вашей папке Android SDK (загрузите соответствующие образцы по мере необходимости) для простого примера:
private class MyListAdapter extends BaseAdapter {
...
public View getView(int position, View convertView, ViewGroup parent) {
TextView tv;
if (convertView == null) {
tv = (TextView) LayoutInflater.from(mContext).inflate(
android.R.layout.simple_expandable_list_item_1, parent, false);
} else {
tv = (TextView) convertView;
}
tv.setText(mStrings[position]);
return tv;
}
...
}