【问题标题】:Android ListView Views Not Being ConditionedAndroid ListView 视图没有被调节
【发布时间】:2016-07-19 01:40:34
【问题描述】:

我正在使用自定义阵列适配器来填充我的聊天屏幕。为此,我使用一个条件来查看谁是发件人,并据此分配设计(红色(已接收消息)或蓝色(已发送消息))。

但是,当我第一次发送消息时,它不会检查条件并将默认布局应用于聊天消息。

从那时起,随后,它选择布局的最后一个状态来显示消息,而不检查它是发送消息还是接收消息。(例如,如果我收到一条消息,它将根据条件设置红色,但在那之后,当我发送消息时,它会自动将其分配为红色,而不检查条件(它应该分配为蓝色,因为它是已发送的消息)。

ChatAdapter 的代码如下:

   import com.tanishqsharma.unanswered.dbHandler.PrefManager;


import java.util.ArrayList;

/**
 * Created by Tanishq on 16-06-2016.
 */
public class ChatAdapter extends ArrayAdapter<MessageObject> {

    ArrayList<MessageObject> local_obj;
    PrefManager prefManager;
    FontGenerator FG;
    String sender;
    Animation fadein;
    Animation fade_out;
    String message;

    public ChatAdapter(Context context, ArrayList<MessageObject> passed_obj) {
        super(context, R.layout.chat_message ,passed_obj);
        prefManager = new PrefManager(context);
        FG = new FontGenerator(context);
        fadein = AnimationUtils.loadAnimation(getContext(), R.anim.fade_in);
        fade_out = AnimationUtils.loadAnimation(getContext(), R.anim.fade_out);
        this.local_obj = passed_obj;
    }

    static class ViewHolderChatMessage
    {
        LinearLayout layoutchat;
        LinearLayout mainChatLayout;
        TextView message;
        TextView datetime;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = convertView;

        final ViewHolderChatMessage viewHolderChatMessage;
        if(view==null)
        {
            LayoutInflater layoutInflater = LayoutInflater.from(getContext());
            view = layoutInflater.inflate(R.layout.chat_message, parent, false);
            viewHolderChatMessage = new ViewHolderChatMessage();
            viewHolderChatMessage.message = (TextView)view.findViewById(R.id.chatbubble);
            viewHolderChatMessage.layoutchat = (LinearLayout)view.findViewById(R.id.layoutchat);
            viewHolderChatMessage.mainChatLayout = (LinearLayout)view.findViewById(R.id.mainChatLayout);
            viewHolderChatMessage.datetime = (TextView)view.findViewById(R.id.DateTime);
            view.setTag(viewHolderChatMessage);
        }
        else
        {
            viewHolderChatMessage = (ViewHolderChatMessage) view.getTag();
        }

        viewHolderChatMessage.mainChatLayout.setGravity(Gravity.BOTTOM);
        message = local_obj.get(position).getMessage();
        viewHolderChatMessage.message.setText(message);
        viewHolderChatMessage.message.setTypeface(FG.getRobotoRegular());

        viewHolderChatMessage.datetime.setVisibility(View.GONE);

        sender = local_obj.get(position).getSender();

        if(sender!=null)
        {
            if(sender.equals(prefManager.getUserMobile()))
            {
                viewHolderChatMessage.message.setBackgroundResource(R.drawable.rounded_chat_blue);
                viewHolderChatMessage.layoutchat.setGravity(Gravity.END);
                viewHolderChatMessage.datetime.setText(local_obj.get(position).getDate());
                viewHolderChatMessage.datetime.setGravity(Gravity.END);

            }
            else
            {
                viewHolderChatMessage.message.setBackgroundResource(R.drawable.rounded_chat_red);
                viewHolderChatMessage.layoutchat.setGravity(Gravity.START);
                viewHolderChatMessage.datetime.setText(local_obj.get(position).getDate());
                viewHolderChatMessage.datetime.setGravity(Gravity.START);

            }
        }

        viewHolderChatMessage.message.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                viewHolderChatMessage.datetime.setVisibility(View.VISIBLE);
                viewHolderChatMessage.datetime.startAnimation(fadein);
                viewHolderChatMessage.datetime.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        viewHolderChatMessage.datetime.setVisibility(View.GONE);
                        viewHolderChatMessage.datetime.startAnimation(fade_out);
                    }
                }, 3000);
            }
        });


        return view;
    }

    @Override
    public void add(MessageObject object) {
        super.add(object);

        notifyDataSetChanged();
    }
}

例子:

如您所见,第一条消息默认出现在左侧,尽管根据条件,它应该出现在右侧。一直在尝试不同的方法,例如 notifysetdatachanged(),但效果不佳。

我提到的第二个错误,它是根据我猜的最后一个视图发送者将聊天消息添加到适配器。

感谢所有可能的帮助。

【问题讨论】:

    标签: android listview arraylist


    【解决方案1】:

    通过使用此方法解决了问题。由于我没有使用推送,它每次都创建一个保存请求,当我的适配器/接收器类反映时,它只读取空值。

    推()

    【讨论】:

      猜你喜欢
      • 2011-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多