ArrayAdapter:根据项目更改资源 (Android)

ArrayAdapter: Change resource depending on item (Android)

我正在我的应用程序中创建一种消息传递 activity,并且我正在使用自定义的 ArrayAdapter 来显示 ListView 中的项目。我想让它们根据接收或发送的事实(如 Whatsapp 或任何其他消息传递应用程序)向右或向左移动。我尝试了以下代码,但它并不总是用正确的资源显示它们:

public class MessagesAdapter extends ArrayAdapter<Messages>{
private LayoutInflater mInflater;
private int mResource;
private String username;

/**
 * Constructor
 *
 * @param context     The current context.
 * @param resource    The resource ID for a layout file containing a TextView to use when
 *                    instantiating views.
 * @param messages The objects to represent in the ListView.
 */
public MessagesAdapter(Context context, int resource, List<Messages> messages, String username )
{
    super( context, resource, messages );
    mResource = 0;
    mInflater = (LayoutInflater) context.getSystemService( Context.LAYOUT_INFLATER_SERVICE );
    this.username = username;
}

@Override
public Messages getItem(int position) {
    return super.getItem(getCount() - position - 1);
}

/**
 * {@inheritDoc}
 */
@Override
public View getView( int position, View convertView, ViewGroup parent )
{
    Messages item = getItem( position );

    if (item.getSendername().contentEquals(username)){
        mResource = R.layout.message_right;
        Log.w("Messages", "TRUE" );

    } else {
        mResource = R.layout.message_left;
        Log.w("Messages", "FALSE" );
    }

    View view = convertView == null ? mInflater.inflate( mResource, parent, false ) : convertView;

    TextView txtMessage = (TextView) view.findViewById( R.id.txtMessage );
    txtMessage.setText( item.getTextmess() );

    return view;
}

它实际上会在正确的时间打印消息 'TRUE' 和 'FALSE',但有时它仍然会使用错误的资源显示消息。

看起来当你检查 convertView 是否为 null 时,如果为 true,你会膨胀你想要的资源,但如果不是,你只是重用以前的视图,它可能不是具有正确资源的视图.

问题出在这个三元行的 false 部分:

View view = convertView == null ? mInflater.inflate( mResource, parent, false ) : convertView;

当它为 false 时,它​​不会在您检查用户名时考虑您的 mResource

您可能想要检查是否需要更改 convertView 的资源,或者可能甚至跳过检查 convertView 是否为 null 并且每次都只膨胀一个新视图。

试试这个:适配器

public class MessagesAdapter extends BaseAdapter {

private List<Messages> arrayList;
private Context context;
private LayoutInflater layoutInflater;

String username;

public MessagesAdapter(Context context, List<Messages> arrayList, String username) {
    this.context = context;
    this.arrayList = arrayList;
    this.username = username;
    this.layoutInflater = LayoutInflater.from(context);
}

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

@Override
public Messages getItem(int position) {
    return arrayList.get(position);
}

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

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

@Override
public int getItemViewType(int position) {
    if (arrayList.get(position).getSendername().contentEquals(username)){
        return 0;

    } else {
        return 1;
    }
}

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

    switch (getItemViewType(position)) {

        case 0:
            if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.left, null);
                convertView.setTag(new ViewHolderLeft(convertView));
            }

            initializeViews((Messages) getItem(position), (ViewHolderLeft) convertView.getTag(), position);
            break;
        case 1:

            if (convertView == null) {
                convertView = layoutInflater.inflate(R.layout.rigt, null);
                convertView.setTag(new ViewHolderRight(convertView));
            }

            initializeViews((Messages) getItem(position), (ViewHolderRight) convertView.getTag(), position);

            break;
    }
    return convertView;


}

private void initializeViews(Messages item, ViewHolder holder, int position) {
    holder.leftTv.setText(item.getLeft());

}

private void initializeViews(Messages item, ViewHolderRight holder, int position) {
    holder.rightTv.setText(item.getRight());
}

protected class ViewHolderLeft {

    private TextView leftTv;

    public ViewHolderLeft(View view) {
        leftTv = (TextView) view.findViewById(R.id.left_tv);
    }
}

protected class ViewHolderRight {

    private TextView rightTv;

    public ViewHolderRight(View view) {
        rightTv = (TextView) view.findViewById(R.id.right_tv);
    }
}


}