2017-03-12 87 views
1

我在应用程序内部创建了一种消息传递活动,我正在使用定制的ArrayAdapter在ListView中显示项目。我想让他们在右边或左边,取决于他们被接收或发送(如Whatsapp或任何其他消息应用程序)的事实。我试着下面的代码,但它并不总是正确的资源显示它们:ArrayAdapter:根据项目更改资源(Android)

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; 
} 

它实际打印消息“真”和“假”在正确的时间,但是,尽管如此,有时它会显示消息使用错误的资源。

在此先感谢您的帮助,

加布里埃莱

回答

1

看起来,当您检查是否convertView为空,如果是真的,你吹你想要的资源一样,但如果没有,你只是重复以前的观点,这可能不是具有正确资源的那个。

的问题是在这三进制线路的false部分:

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

当它是假的,它不会把你的mResource考虑从当您检查的用户名。

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

+0

完美。谢谢! –

0

试试这个:适配器

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); 
    } 
} 


}