Пользовательский SimpleAdapter показывает только образец текста Android - PullRequest
3 голосов
/ 02 августа 2011

Прежде чем создать свой собственный объект SimpleAdapter, потому что я хотел изменить цвет строк, я просто использовал новый SimpleAdapter (...).Теперь, когда я использую свой собственный SimpleAdapter, цвет строки меняется, но мой текст не обновляется.Я вызвал adapter.notifyDataSetChanged (), но он по-прежнему показывает только образец текста - «TextView».Как я уже сказал, все работало нормально, когда я не создал свой собственный адаптер.Я подозреваю, что это может быть связано с порядком инициализации:

public class AddScreen extends Activity implements OnClickListener,
    OnItemClickListener, OnItemLongClickListener {
SimpleAdapter adapter;
List<HashMap<String, String>> painItems = new ArrayList<HashMap<String, String>>();
ListView listthings;
int[] to;
    String[] from;

public void onCreate(Bundle savedInstanceState) {
...
listthings = (ListView) findViewById(R.id.listthings);
    from = new String[] { "row_1", "row_2" };
    to = new int[] { R.id.row1, R.id.row2 };

    adapter = new Adapter(this, painItems, R.layout.mylistlayout,
            from, to);

    listthings.setAdapter(adapter);
...
}

public class Adapter extends SimpleAdapter{
    HashMap<String, String> map = new HashMap<String, String>();
    public Adapter(Context context, List<? extends Map<String, String>> data,
            int resource, String[] from, int[] to) {
        super(context, data, resource, from, to);

    }
@Override
    public View getView(int position, View convertView, ViewGroup parent){
        View row = convertView;
        if (row == null) {
            LayoutInflater mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            row = mInflater.inflate(R.layout.mylistlayout, parent, false);
            }
        row.setBackgroundColor(0xFF0000FF);
       TextView rw1 = (TextView)findViewById(R.id.row1);
      // TextView rw2 = (TextView)findViewById(R.id.row2);
       rw1.setText(map.get(position));
       return row;
    }

}
// to add the item, put it in the map, and add the map into the list
private void addItem() {
    HashMap<String, String> map = new HashMap<String, String>();
    map.put("row_1", row1);
    map.put("row_2", row2);
    map.put("row_3", painLevelString);
    map.put("row_4", painLocation);
    map.put("row_5", timeOfPainString);
    map.put("row_6",textTreatmentString);
    painItems.add(map);

        adapter.notifyDataSetChanged();




}

РЕДАКТИРОВАТЬ: добавлен код

Вот как я получаю данные изнамерение (onActivityResult ()), помещаемое перед кодом addItem:

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == 1) {
        row1 = data.getStringExtra("com.painLogger.row1");
        row2 = data.getStringExtra("com.painLogger.row2");

        painLevelString = data.getStringExtra("com.painLogger.painLevel");
        painLocation = data.getStringExtra("painLocation");
        timeOfPainString = data.getStringExtra("com.painLogger.painTime");
        textTreatmentString = data
                .getStringExtra("com.painLogger.treatment");
        addItem();
    }
}

* Кроме того, на всякий случай это уместно, порядок размещения следующий: onCreate () -> Пользовательский класс адаптера -> onActivityResult () -> addItem () * **

Вот скриншот того, как это выглядит.Два поля TextView в каждом элементе должны быть заполнены информацией (которой они были, пока я не сделал этого).

Ответы [ 3 ]

5 голосов
/ 03 августа 2011

Если раньше он работал только с использованием new SimpleAdapter(...), то в вашей реализации getView(...) измените первую строку на эту:

View row = super.getView(position, convertView, parent);

и посмотрите, ожидаете ли вы этого.Уберите LayoutInflater вещи тоже.

1 голос
/ 02 августа 2011

Вам необходимо установить текст в getView().Вот так:

public View getView(int position, View convertView, ViewGroup parent){

    TextView text;

    if (convertView == null) {
        LayoutInflater mInflater = (LayoutInflater)getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        convertView = mInflater.inflate(R.layout.mylistlayout, parent, false);
        text = (TextView) convertView.findViewById(R.id.more_list_text);
    }
    convertView.setBackgroundColor(0xFF0000FF);
    text.setText(map.get(position));
    return convertView;
}

Кроме того, и это ОЧЕНЬ важно - сохраните вашу карту как переменную-член SimpleAdapter
, то есть поместите эту строку вверху определения вашего объекта:

HashMap<String, String> map = new HashMap<String, String>();
1 голос
/ 02 августа 2011

В getView() о том, где вы устанавливаете фон строки, вы также должны установить текст для TextView.

Вызов notifyDataSetChanged(), автоматически не устанавливает правильные тексты, он просто заставляет ListView перерисовать видимые строки с новыми данными ... практически вызывает getView() для каждой строки, которая требует обновления.

Я также предлагаю установить цвет фона из файла mylistlayout.xml, и, если функция getView () начинает принимать несколько findViewByID, вам также следует рассмотреть возможность использования подхода "держателя вида", как в этом примере : http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/view/List14.html

...