如何更改ListView中按钮的可见性只有一行

问题描述:

我已经实现了带有自定义适配器的ListView的即时消息传递布局。每行显示一条消息和小时。实现列表项的xml包含一个Button(@ + id/alert_button),其可见性消失,如果发送的消息出错,该按钮应该可见。如何更改ListView中按钮的可见性只有一行

这里是XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

<RelativeLayout 
    android:id="@+id/content" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <RelativeLayout 
     android:id="@+id/contentWithBackground" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/risponditore" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_gravity="left" 
      android:textSize="10sp" 
      android:textStyle="bold" 
      android:text="" 
      android:visibility="gone" 
      android:textColor="@color/bluScuro"/> 

     <TableLayout 
      android:id="@+id/tabellaMessaggioOra" 
      android:layout_below="@+id/risponditore" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content"> 
      <TableRow 
       android:id="@+id/rigaMessaggio" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content"> 
       <TextView 
        android:id="@+id/txtMessage" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textColor="@android:color/black" 
        android:maxWidth="245dp" 
        android:textSize="12sp" 
        android:layout_gravity="left"/> 
      </TableRow> 
      <TableRow 
       android:id="@+id/rigaOra" 
       android:layout_width="wrap_content" 
       android:layout_height="wrap_content" 
       android:gravity ="right"> 
       <TextView 
        android:id="@+id/ora" 
        android:layout_width="wrap_content" 
        android:layout_height="wrap_content" 
        android:textSize="10sp" 
        android:textColor="@color/grigioScuro" 
        android:layout_gravity="right"/> 
      </TableRow> 
     </TableLayout> 

    </RelativeLayout> 

    <Button 
     android:id="@+id/alert_button" 
     android:layout_toRightOf="@+id/contentWithBackground" 
     android:layout_width="15dp" 
     android:layout_height="15dp" 
     android:layout_marginRight="5dp" 
     android:background="@drawable/alert" 
     android:layout_centerVertical="true" 
     android:visibility="gone"/> 
</RelativeLayout> 

</RelativeLayout> 

这是适配器:

public class ChatAdapter extends BaseAdapter implements 
StickyListHeadersAdapter { 
private List<ChatMessage> lista_messaggi_chat; 
private static final String DATE_FORMAT_ORA = "HH:mm";//formato h24 
private static final String DATE_FORMAT_GIORNO = "dd"; 
private Context context; 
private ViewHolder viewHolder; 
//private boolean visibility; 

public ViewHolder getViewHolder(){ 
    return viewHolder; 
} 

public ChatAdapter(Context context) { 
    this.context = context; 
    this.lista_messaggi_chat = new ArrayList<>(); 
} 

@Override 
public int getCount() { 
    return lista_messaggi_chat.size(); 
} 

@Override 
public Object getItem(int position) { 
    return lista_messaggi_chat.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) 
{ 
    //Log.i(HoustonConstants.TAG,"ChatAdapter getView"); 
    //ViewHolder viewHolder; 
    LayoutInflater inflater = ((Activity)context).getLayoutInflater(); 

    if (convertView == null) { 
     //The view is not a recycled one: we have to inflate 
     convertView = inflater.inflate(R.layout.list_item_message,null); 
     viewHolder = createViewHolder(convertView); 
     convertView.setTag(viewHolder); 
    }else{ 
     // View recycled ! 
     // no need to inflate 
     // no need to findViews by id 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    final ChatMessage messaggio_chat = (ChatMessage)getItem(position); 

    if (messaggio_chat.isIncoming()) { 
      viewHolder.risponditore.setText(messaggio_chat.getAuthor()); 
      viewHolder.risponditore.setVisibility(View.VISIBLE); 
    }else{ 
     viewHolder.risponditore.setText(""); 
     viewHolder.risponditore.setVisibility(View.GONE); 
    } 
    viewHolder.txtMessage.setText(messaggio_chat.getText()); 
    viewHolder.ora.setText(getTimeTextOra(messaggio_chat.getTime())); 

    if(!messaggio_chat.isIncoming() 
    && messaggio_chat == (ChatMessage)getItem(getCount()-1) 
    && messaggio_chat.getAlertVisibility()){ 
     viewHolder.alertButton.setVisibility(View.VISIBLE); 
    } 


    return convertView; 
} 

public void add(ChatMessage message) { 
    lista_messaggi_chat.add(message); 
} 

public void add(List<ChatMessage> messages) { 
    Collections.sort(messages, new Comparator<ChatMessage>() { 
     @Override 
     public int compare(ChatMessage lhs, ChatMessage rhs) { 
      return lhs.getTime().compareTo(rhs.getTime()); 
     } 
    }); 
    this.lista_messaggi_chat = messages; 
} 

private static class ViewHolder { 
    public TextView txtMessage; 
    public RelativeLayout content; 
    public RelativeLayout contentWithBG; 
    public TextView ora; 
    public TextView giorno; 
    public RelativeLayout contenitoreGiorno; 
    public TextView risponditore; 
    public TableRow rigaOra; 
    public TableLayout tabellaMessaggioOra; 
    public Button alertButton; 
    //public TextView alertMessage; 
} 

private ViewHolder createViewHolder(View v) { 
    ViewHolder holder = new ViewHolder(); 
    holder.txtMessage = (TextView) v.findViewById(R.id.txtMessage); 
    holder.content = (RelativeLayout) v.findViewById(R.id.content); 
    holder.contentWithBG = (RelativeLayout) 
v.findViewById(R.id.contentWithBackground); 
    holder.ora = (TextView) v.findViewById(R.id.ora); 
    holder.giorno = (TextView) v.findViewById(R.id.giorno); 
    holder.contenitoreGiorno = (RelativeLayout) 
v.findViewById(R.id.contenitore_giorno); 
    holder.risponditore = (TextView) v.findViewById(R.id.risponditore); 
    holder.rigaOra = (TableRow) v.findViewById(R.id.rigaOra); 
    holder.tabellaMessaggioOra = (TableLayout) 
v.findViewById(R.id.tabellaMessaggioOra); 
    holder.alertButton = (Button) v.findViewById(R.id.alert_button); 
    //holder.alertMessage = (TextView) v.findViewById(R.id.alert_msg); 
    return holder; 
} 

} 

在getView适配器仅如果消息不icoming按钮应该变得可见,如果是最后,如果messaggio_chat.getAlertVisibility()返回true。我在处理发送错误的活动中将其设置为true,我将消息添加到列表中,并且该按钮是可见的。

我的问题是,该按钮变得不仅看到最后一条消息,而且随机看到其他消息。

你能告诉我我做错了什么吗?

预先感谢您。

编辑:

更具体地讲,用户可以发送错误发送多条消息,并且可以有更多的消息,所以我需要更多的行设置可见警报按钮。然后,如果用户点击一个提醒按钮,他可以重新发送一条消息(这还没有实施,但将是下一个)。

+0

将getView()方法的最终int位置更改为int位置。 – Ankita

+0

@Ankita仍然有随机警报按钮可见...谢谢 –

您正在使用ViewHolder模式,并且视图实际上已被回收,因此您必须指定何时它必须可见,何时必须不可见。

if(!messaggio_chat.isIncoming() 
&& messaggio_chat == (ChatMessage)getItem(getCount()-1) 
&& messaggio_chat.getAlertVisibility()){ 
    viewHolder.alertButton.setVisibility(View.VISIBLE); 
} else { 
    viewHolder.alertButton.setVisibility(View.INVISIBLE); 
} 
+0

我试过了,它的工作原理!非常感谢你djevtic –