【问题标题】:android list adapter items not correctly shown after scrolling滚动后未正确显示android列表适配器项目
【发布时间】:2017-02-13 20:00:02
【问题描述】:

我的ListView 中的项目滚动后混淆了。这个问题与adapter 有关,但我不知道出了什么问题。在我的List 中,我存储了几个Events。如果列表变大,它们就会混淆。作为示例,当天的事件将被突出显示,但在 scolling 之后,其他标题也会被突出显示。

public class EintragAdapter extends BaseAdapter {

private ArrayList<Event> eventListe;
private final LayoutInflater inflater;
private Context context;

public EintragAdapter(Context c) {
    super();
    eventListe = new ArrayList<>();
    inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    context = c;
}

@Override
public int getCount() {
    return eventListe.size();
}

@Override
public Event getItem(int position) {
    return eventListe.get(position);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public boolean isEmpty() {
    return eventListe.isEmpty();
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    final ViewHolder viewHolder;
    final Event event = getItem(position);

    if (convertView == null) {
        convertView = inflater.inflate(R.layout.item_event, parent, false);
        viewHolder = new ViewHolder(convertView);
        convertView.setTag(viewHolder);
    } else {
        viewHolder = (ViewHolder) convertView.getTag();
    }

    String endDate = event.getEnd();
    if (endDate.isEmpty()) {
        viewHolder.date.setText(event.getStart());
    } else {
        viewHolder.date.setText(String.format("%1$s %2$s %3$s", event.getStart(), "bis", endDate));
    }

    if (event.isToday()) {
        viewHolder.title.setTextColor(parent.getResources().getColor(R.color.colorAccent));
    }

    MainActivity mainActivity = (MainActivity) context;
    if (!mainActivity.userIsAdmin()) {
        viewHolder.delete.setVisibility(View.GONE);
    }

    // viewHolder.timestamp.setText(String.format("%1$s %2$s", "Zuletzt geändert:", event.getTimestamp()));
    if (!event.getDescription().isEmpty())
        viewHolder.description.setText(event.getDescription());
    viewHolder.title.setText(event.getTitle());
    viewHolder.delete.setTag(event);
    return convertView;
}

public void addJSONArray(JSONArray array) throws JSONException {
    if (!eventListe.isEmpty())
        eventListe.clear();

    for (int i = 0; i < array.length(); i++) {
        JSONObject object = array.getJSONObject(i);
        eventListe.add(new Event(
                object.getInt("id"),
                object.getString("title"),
                object.getString("description"),
                object.getString("start"),
                object.getString("end"),
                object.getString("reg_date")));
    }

    // sort by date - descending
    Collections.sort(eventListe, new Comparator<Event>() {
        @Override
        public int compare(Event event1, Event event2) {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault());

            try {
                Date date1 = format.parse(event1.getStart());
                Date date2 = format.parse(event2.getStart());
                return date1.compareTo(date2);
            } catch (ParseException e) {
                e.printStackTrace();
            }

            return 0;
        }
    });

    notifyDataSetChanged();
}

private static class ViewHolder {
    final TextView title, date, description;
    final View delete;

    ViewHolder(View view) {
        title = (TextView) view.findViewById(R.id.event_title);
        date = (TextView) view.findViewById(R.id.event_date);
        description = (TextView) view.findViewById(R.id.event_description);
        delete = view.findViewById(R.id.deleteButton);
    }
}
}

【问题讨论】:

  • 最后我用这个Solution解决了我的问题。感谢您的帮助

标签: android list scroll adapter


【解决方案1】:

在你的适配器类中重写这两个方法

@Override
public int getViewTypeCount() {
   return getCount();
}

@Override
public int getItemViewType(int position) {
   return position;
}

编辑 1:

getViewTypeCount() 应该返回您的ListView 包含的不同视图的数量。如果ListView 中的所有项目都是同一类型,则应返回 1。

最初,您的 eventListe 为空,getCount() 方法返回 0,这导致了 Exception

改变这个方法
@Override
public int getViewTypeCount() {
   return getCount()>0?getCount():1;
}

【讨论】:

  • 第一种方法给出了 IllegalArgumentException: Can't have a ViewTypeCount
  • 您在类中调用 addJSONArray() 方法的位置(适配器/活动)。
  • 我在 MainActivity 中调用 addJSONArray()
  • 你是对的,但问题仍然存在。有没有可能不是适配器的问题?
【解决方案2】:

为此,您必须同时处理两种情况(if 和 else) 像这样

if (event.isToday()) {
    viewHolder.title.setTextColor(parent.getResources().getColor(R.color.colorAccent));
}
else{viewHolder.title.setTextColor(/*Default color here*/);}

这将解决您的突出显示问题。 现在将适配器构造函数修改为

public EintragAdapter(Context c, ArrayList<Event> data) {
super();
eventListe = data;  //data not be null
inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
context = c;

}

【讨论】:

  • 这只是一个例子。我的描述也混淆了
  • hightling 工作正确,只有在 scolling 突出显示的标题被混淆之后。我突出显示标题的解决方案是正确的,因为如果今天没有活动,它们将保持默认颜色。
  • Activity UrAdapter 中的伪代码 ad = new UrAdapter(EventArrayList);
  • 然后 list.setAdapter(ad); EventArrayList.add(内容); ad.notifydatasetchanged();
  • 我解决了我的问题。请参阅我的原始帖子下的评论
猜你喜欢
  • 1970-01-01
  • 2015-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-08
  • 2018-11-05
  • 1970-01-01
  • 2021-04-23
相关资源
最近更新 更多