Динамически изменять расположение строк в ListView - PullRequest
8 голосов
/ 15 августа 2011

Я работаю над модулем чата в приложении, где мне нужны сообщения от двух участников о противоположном выравнивании (другой пользователь выровнен по левому краю, а мой собственный msg - по правому краю). Прямо сейчас мой макет строки передается через статический макет xml (с msg и аватаром выровнены по левому краю). Есть ли способ динамического изменения представления или способ передать альтернативный макет строки, который система пользовательского интерфейса выберет во время выполнения?

Ответы [ 4 ]

5 голосов
/ 05 сентября 2012
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.Ваш класс адаптера Cusom расширяет базовый адаптер. 2. Переопределите getItemViewType () и getViewTypeCount () 3. Раздуйте представление в зависимости от типа в getView ()

5 голосов
/ 15 августа 2011

Вы можете сделать это в методе getView() вашего ArrayAdapter класса (при условии, что вы определяете свой собственный ArrayAdapter).

У вас может быть что-то вроде этого:

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 будет вызываться каждый раз, когда вы изменяете ListView (например, когда вы прокручиваете или когда к нему добавляются новые элементы), так что вы можете манипулировать каждой строкой как ты хочешь там. Не забудьте установить адаптер массива ListView для экземпляра этого класса.

listView.setListAdapter(new mYourAdapter);  
2 голосов
/ 15 августа 2011

Мне было показано, как это сделать (я не уверен, что это лучший метод или нет!) - это иметь оба представления в одном файле XML. Во время выполнения вы можете получить ссылку на каждое представление (используя findViewById) и установить для свойства visible значение «исчезнет» из того, которое вам не нужно.

Я попробую найти пример кода, если это не ясно?

0 голосов
/ 08 апреля 2016

Мой код:

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);
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...