#android #android-listview
#Android #android-listview
Вопрос:
На прикрепленном изображении макета фрагмента из блога Google у меня есть listview в моем коде. Мой вопрос здесь заключается в том, чтобы установить для первых двух элементов (Генрих IV и Генрих V) цвета фона КРАСНОГО, а остальные останутся значениями backgroudn по умолчанию. Возможно ли это?
Любая помощь была бы действительно оценена.
Спасибо, Сана.
Код, который я использую для получения ListView, является
Log.i(TAG, "Selected item position = " getListView().getCount() " Child count = " getListView().getChildCount());
for (int i=0; i<getListView().getCount();i ) {
Log.i(TAG, "Item id = " getListView().getItemIdAtPosition(i));
View v = getActivity().findViewById((int) getListView().getItemIdAtPosition(i));
View v1 = getListView().getChildAt(i);
Log.i(TAG, "Condition = " (v == null)); //Here I get the display as true
Log.i(TAG, "Condition1 = " (v1 == null)); //Here I get again a true, so basically both are none!
}
Ответ №1:
Лучше всего хранить элемент данных для ваших королей и использовать адаптер массива для их отображения, который вы можете уведомлять об изменениях и устанавливать соответствующие цвета по мере отображения.
Полный пример того, что вам нужно, находится здесь:
public class TestStuff extends Activity {
private class KingItem {
public KingItem(String name, String description) {
this.name = name;
this.description = description;
this.hexColor = "#000000";
}
public String name;
public final String description;
public String hexColor;
}
private List<KingItem> kings = new ArrayList<TestStuff.KingItem>();
private ListView kingsList;
private ArrayAdapter<String> kingAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
kings.add(new KingItem("Henry IV(1)", "Description form Henry IV(1)"));
kings.add(new KingItem("Henry V", "Description for Henry V"));
kings.add(new KingItem("Henry VIII", "Description for Henry VIII"));
kings.add(new KingItem("Richard II", "Description for Richard II"));
kingsList = (ListView) findViewById(R.id.list);
if (kingAdapter == null) {
kingAdapter = new KingsListAdapter(this, this, android.R.layout.simple_list_item_1, new ArrayList<String>());
}
kingAdapter.clear();
kingsList.setAdapter(kingAdapter);
kingsList.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
TextView desc = (TextView) TestStuff.this.findViewById(R.id.text);
KingItem king = kings.get(position);
desc.setText(king.description);
king.hexColor = "#0000ff";
for (int i=0; i<position; i ) {
kings.get(i).hexColor = "#ff0000";
}
for (int i=position 1; i<kings.size(); i ) {
kings.get(i).hexColor = "#000000";
}
kingAdapter.notifyDataSetChanged();
}
});
for (KingItem king : kings) {
kingAdapter.add(king.name);
}
kingAdapter.notifyDataSetChanged();
}
private class KingsListAdapter extends ArrayAdapter<String> {
private final Activity activity;
private final int textViewResourceId;
public KingsListAdapter(Activity activity, Context context, int textViewResourceId, List<String> kingsNames) {
super(context, textViewResourceId, kingsNames);
this.activity = activity;
this.textViewResourceId = textViewResourceId;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater vi = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = vi.inflate(textViewResourceId, null);
}
KingItem kingItem = kings.get(position);
TextView text1 = (TextView) v.findViewById(android.R.id.text1);
text1.setText(kingItem.name);
v.setBackgroundColor(Color.parseColor(kingItem.hexColor));
return v;
}
}
}
При этом все элементы, вплоть до выбранного в данный момент, будут выделены красным цветом, а выбранный — синим, все, что после выбранного в данный момент элемента, вернется к черному фону.
Обратите внимание, что я просто устанавливаю для элемента KingItem правильный цвет, а затем указываю списку на повторный рендеринг. Нет необходимости получать представления или родителей и пытаться умно установить фон. Вместо этого я сохраняю эту информацию в элементе King и делаю адаптер очень простым.
Ответ №2:
Да, это возможно… пожалуйста, проверьте ссылку ниже
http://www.androidpeople.com/android-custom-listview-tutorial-part-1
http://www.androidpeople.com/android-custom-listview-tutorial-part-2
И добавьте одну вещь в пользовательский listview внутри используемого ниже кода.
public View getView(int position, View convertView, ViewGroup parent) {
...... your code add extra line.
if (position == 0 || position == 1){
holder.layout.setBackgroundColor(Color.RED);
}
}
Комментарии:
1. Это простой ListView, и я просто использую setListAdapter (новый ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_activated_1, object.from)); для расширения списка. Я не создаю пользовательский адаптер для его раздувания!