2011-08-15 11 views
8

Estoy trabajando en un módulo de chat en una aplicación, donde quiero los mensajes de dos participantes en alineación opuesta (otro usuario alineado a la izquierda y mi propio mensaje alineado a la derecha). En este momento, el diseño de mi fila se transfiere a través de un diseño estático xml (con msg y avatar alineado a la izquierda). ¿Hay alguna forma de modificar la vista dinámicamente o hay una forma de pasar un diseño de fila alternativo para que el sistema de UI seleccione en tiempo de ejecución?Cambie dinámicamente el diseño de filas de un ListView

Respuesta

5

usted puede hacer que el interior del método de su ArrayAdapter clase getView() (suponiendo que está definiendo su propio ArrayAdapter).

Usted podría tener algo como esto:

private class YourAdapter extends ArrayAdapter<Message> { 
     private final LayoutInflater mLayoutInflater; 

    YourAdapter(YourListActivity activity) { 
     super(mContext, 0); 
     mLayoutInflater = LayoutInflater.from(activity); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      // Inflate your view 
      convertView = mLayoutInflater.inflate(R.layout.list_view_item, parent, false); 
      mViewHolder = new ViewHolder(); 
      mViewHolder.avatar = (ImageView) convertView.findViewById(R.id.placeholder); 
      mViewHolder.message = (TextView) convertView.findViewById(R.id.message); 

      convertView.setTag(mViewHolder); 
     } else { 
      mViewHolder = (ViewHolder) convertView.getTag(); 
     } 

     final Message message = getItem(position); 

     mViewHolder.message.setText(message.getMessage()); 
     // etc. Manipulate your views as you wish 


     return convertView; 
    } 
} 


    private static class ViewHolder { 
     TextView message; 
     ImageView avatar; 
    } 

getView se llamará cada vez que se modifica la ListView (como cuando se desplaza o cuando se añaden nuevos elementos a la misma), por lo que se puede manipular cada fila como quiera allí. No olvide configurar el adaptador de matriz ListView en una instancia de esta clase.

listView.setListAdapter(new mYourAdapter); 
2

Una manera me ha mostrado que hacerlo (no estoy seguro de si es la mejor práctica o no!) Es que ambos puntos de vista en un archivo XML. En el tiempo de ejecución, puede obtener una referencia a cada vista (utilizando findViewById) y establecer la propiedad visible de la que no desea.

¿Intentaré encontrar un código de muestra si no está claro?

+0

oh, eso es factible? Terminé haciendo un simplecursoradapter personalizado, donde pasé en un int [] [] en lugar de int [] para el conjunto de ID de vista, ya que he estado utilizando simplecursoradapter antes. – jingyin

5
private LayoutInflater mInflater; 
private static final int TYPE_ITEM1 = 0; 
private static final int TYPE_ITEM2 = 1; 
ArrayList<String> s= new ArrayList<String>(); 
int time; 
String names[]={"raghu","pavan","rakesh","raghu","pavan"}; 
Context c; 

@Override 
public int getItemViewType(int position) { 
    if((position%2)==0) 
    { 
     return 0; 
    } 
    return 1;  
} 

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

public Customlistadapter(CustomListView customListView, int time) { 
    // TODO Auto-generated constructor stub 
    for(int i=0;i<=10;i++) 
    { 
     s.add("Raghu"); 
    } 
    this.mInflater = LayoutInflater.from(customListView); 
    c=customListView; 
    this.time=time; 
} 
public int getCount() { 
    return s.size(); 
} 

public Object getItem(int arg0) { 
    return s.get(arg0); 
} 

public long getItemId(int arg0) { 
return 0; 
} 

@Override 
public void notifyDataSetChanged() { 
    super.notifyDataSetChanged(); 
    if(CustomListView.chk==true) 
    { 
    s.add("Raghu"); 
    } 
    else if(CustomListView.chk==false) 
    { 
    s.remove(s.size()-1); 
    }  
} 
@Override 
public void notifyDataSetInvalidated() { 
    super.notifyDataSetInvalidated(); 
} 
public View getView(final int arg0, View arg1, ViewGroup arg2) { 
    ViewHolder vh; 
    vh= new ViewHolder(); 
    int type = getItemViewType(arg0); 
    System.out.println("getView " + arg0 + " type = "+type); 
    if(arg1==null) 
    { 
     switch (type) { 
     case TYPE_ITEM1: 
      arg1=mInflater.inflate(R.layout.listview, arg2,false);    
      vh.tv= (TextView)arg1.findViewById(R.id.textView1); 
      vh.tv1= (TextView)arg1.findViewById(R.id.textView2); 
      vh.tv2=(TextView)arg1.findViewById(R.id.textView3); 
      vh.tv.setText(s.get(arg0)); 
      vh.tv1.setText(s.get(arg0)); 
      vh.tv2.setText(Integer.toString(time)); 
      break; 
     case TYPE_ITEM2: 
      arg1=mInflater.inflate(R.layout.listviewimg, arg2,false); 
      vh= new ViewHolder(); 
      vh.iv1= (ImageView)arg1.findViewById(R.id.iv1); 
      vh.iv2= (ImageView)arg1.findViewById(R.id.iv2); 
      vh.iv1.setBackgroundResource(R.drawable.ic_launcher); 
      vh.iv2.setBackgroundResource(R.drawable.ic_launcher); 
      break; 
    } 
     arg1.setTag(vh); 
    } 
    else 
    { 
     vh= (ViewHolder) arg1.getTag(); 
    } 
    return arg1; 
} 

1.You Cusom Adapter class extends base Adapter. 2. Anulación getItemViewType() y getViewTypeCount() 3. Inflar una vista en función del tipo de getView()

0

Mi código:

private void setAlignment(ViewHolder holder, boolean isOutgoing, QBChatMessage chatMessage) { 

    if (!isOutgoing) { 
     LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.contentWithBG.getLayoutParams(); 
     layoutParams.gravity = Gravity.LEFT; 
     holder.contentWithBG.setLayoutParams(layoutParams); 

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content.getLayoutParams(); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT, 0); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT); 
     holder.content.setLayoutParams(lp); 

     layoutParams = (LinearLayout.LayoutParams) holder.txtInfo.getLayoutParams(); 
     layoutParams.gravity = Gravity.RIGHT; 
     holder.txtInfo.setLayoutParams(layoutParams); 

     if (holder.txtMessage != null) { 
      holder.contentWithBG.setBackgroundResource(R.drawable.bubblevioletcopy); 
      layoutParams = (LinearLayout.LayoutParams) holder.txtMessage.getLayoutParams(); 
      layoutParams.gravity = Gravity.RIGHT; 
      holder.txtMessage.setLayoutParams(layoutParams); 
      holder.lnr_image.setLayoutParams(layoutParams); 
     } else { 
      holder.contentWithBG.setBackgroundResource(android.R.color.transparent); 
     } 
    } else { 
     LinearLayout.LayoutParams layoutParams = (LinearLayout.LayoutParams) holder.contentWithBG.getLayoutParams(); 
     layoutParams.gravity = Gravity.LEFT; 
     holder.contentWithBG.setLayoutParams(layoutParams); 

     RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) holder.content.getLayoutParams(); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_RIGHT, 0); 
     lp.addRule(RelativeLayout.ALIGN_PARENT_LEFT); 
     holder.content.setLayoutParams(lp); 

     layoutParams = (LinearLayout.LayoutParams) holder.txtInfo.getLayoutParams(); 
     layoutParams.gravity = Gravity.RIGHT; 
     holder.txtInfo.setLayoutParams(layoutParams); 

     if (holder.txtMessage != null) { 
      holder.contentWithBG.setBackgroundResource(R.drawable.bubblegraycopy); 
      layoutParams = (LinearLayout.LayoutParams) holder.txtMessage.getLayoutParams(); 
      layoutParams.gravity = Gravity.RIGHT; 
      holder.txtMessage.setLayoutParams(layoutParams); 
     } else { 
      holder.contentWithBG.setBackgroundResource(android.R.color.transparent); 
     } 
    } 
} 
+0

en el módulo de chat solo –

+0

Proporcione algunas explicaciones además de su código. – Jan

+0

trabajo en el módulo de chat cuando envío un mensaje, diseño diferente o cambio de vista y otra persona me envía un mensaje y luego muestra un diseño diferente –

Cuestiones relacionadas