2017-03-12 90 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); 
    } 
} 


}