列表视图中的Android多行项目

时间:2015-07-26 05:09:02

标签: android listview android-listview

我试图通过检查getView中的所有ArrayList项来更改列表视图中的行。如果item.getSend_status()-1,则convertView必须为layout_message_content_list_rtl,否则为layout_message_content_list_ltr

在我的getView中写道,但滚动列表视图else之后无法正常工作且所有项目仅layout_message_content_list_ltr充气,例如,如果我在{{1}中有两个项目作为这个结构:

ArrayList
第一项public class RowItems{ int send_status; String title; } 中的

send_status,第二项是-1,我的列表视图必须有不同的项目,但是这些项目工作不正常,我只在listview中进行膨胀< / p>

1

logcat的:

此结果适用于@Override public View getView(int position, View convertView, ViewGroup parent) { ViewHolder mViewHolder; MessagesList item = getItem(position); if (convertView == null) { if (item.getSend_status() == -1) { convertView = inflater.inflate(R.layout.layout_message_content_list_rtl, null); } else{ convertView = inflater.inflate(R.layout.layout_message_content_list_ltr, null); } mViewHolder = new ViewHolder(convertView); convertView.setTag(mViewHolder); } else { mViewHolder = (ViewHolder) convertView.getTag(); } mViewHolder.fillItems(this, item, position); return convertView; } Log.e("Send_status: ",item.getSend_status()+"");

fillItems

1 个答案:

答案 0 :(得分:1)

这不会起作用,是预期的行为。我们应该首先了解convertView代表什么!

为了重新使用视图,android将已经膨胀的视口外位置视图回收到名为convertView的getView()方法。对于同类列表(单一类型的布局),这可以很好地完成,因为convertView将具有与新视图相同的布局。所以android说,&#34;嘿,视图已经膨胀,接受它!只需使用该位置的数据更新其中的项目!&#34;

现在如果你有两种类型的布局怎么办?不用担心,这适用于Adapter的架构!

您需要在适配器代码中覆盖以下两种方法:

@Override
public int getViewTypeCount() {
    return 2; //Number of different layouts in the list. "rtl" and "ltr" = 2 in your case.
}

@Override
public int getItemViewType(int position) {
    MessagesList item = getItem(position);
    if (item.getSend_status() == -1) {
        return 0; // for rtl
    }
    else {
        return 1; // for ltr
    }
    //The return value must be less than the view type count
}

现在,在您的getView()方法中,执行以下操作:

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder   mViewHolder;
    MessagesList item = getItem(position);
    View newView = convertView;

    if (newView == null) {
        if (getItemViewType(position)==0) {
            newView = inflater.inflate(R.layout.layout_message_content_list_rtl, parent, false);
        } else {
            newView = inflater.inflate(R.layout.layout_message_content_list_ltr, parent, false);
        }
        mViewHolder = new ViewHolder(newView);
        newView.setTag(mViewHolder);
    } else {
        mViewHolder = (ViewHolder) newView.getTag();
    }

    mViewHolder.fillItems(this, item, position);

    return newView;
}