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
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);
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?
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()
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);
}
}
}
en el módulo de chat solo –
Proporcione algunas explicaciones además de su código. – Jan
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 –
- 1. Android: cambie dinámicamente la imagen en Listview
- 2. ListView con diseño de filas personalizado - Android
- 3. Cambie el título de UITabBarItem dinámicamente
- 4. Cambie dinámicamente JComboBox
- 5. Qt - cambie el diseño de QWidget
- 6. Cambie dinámicamente las opciones en un wx.ComboBox()
- 7. Eliminar el separador ListView (en el archivo de diseño xml)
- 8. Android: ¿Cómo incluir dinámicamente un diseño XML?
- 9. Cambie el peso del componente dinámicamente en GridBagLayout
- 10. Cambie dinámicamente la conexión de Crystal Report
- 11. Cambie dinámicamente plantilla de elemento GridView
- 12. Cambie las rutas MVC de ASP.NET dinámicamente
- 13. Diferentes diseños de filas en ListView
- 14. cambia dinámicamente el color de la fuente TextView en ListView
- 15. Cambie el valor en el archivo app.config dinámicamente
- 16. Filas de altura variable en WinForms ListView
- 17. ¿Está bien cambiar dinámicamente el adaptador de ListView?
- 18. Establecer el número máximo de filas visibles para listview
- 19. Cambie la barra de herramientas de CKEditor dinámicamente
- 20. Android Predeterminado Listview row Diseño
- 21. Reorganizar dinámicamente el diseño con Swing
- 22. Diseño de Android con ListView y botones
- 23. Cambie dinámicamente la ruta de archivo XSD en Crystal Reports
- 24. Diseño de cambio de Android dinámicamente
- 25. Cambie dinámicamente una animación de rotación en WPF
- 26. Filas dinámicamente refrescantes en una tabla HTML usando un UpdatePanel
- 27. Cambie dinámicamente la imagen de inicio en iOS
- 28. C# Listview Arrastrar y colocar filas
- 29. Set lineal fondo de diseño dinámicamente
- 30. androide añadir dinámicamente elemento de diseño XML
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