我正在尝试为信使设计一个聊天泡泡。我只是不知道如何显示消息时间指示器,就像在 Telegram 中一样:
我们希望文本锚定在气泡的一角,而不是与文本重叠。
我需要在开始输入 EditText 期间以及输入每 N 个字符后执行特定操作。这怎么可能实现呢?
我怎样才能找出从“时间开始”(0年,1个月,1天)到今天已经过去的天数?
切换网络后(比如从Wifi切换到移动网络),socket报错
class java.net.SocketException
recvfrom failed: ETIMEDOUT (Connection timed out)
也许有某种方法可以跟踪网络变化?是否有可能以某种方式明确地确定网络中的更改位置以及通常的套接字超时错误在哪里?
有一个类继承了AsyncTask。在protected Void doInBackground(Void... voids)
我通过连接到服务器的过程Socket
中,不断在套接字上侦听新数据。由于此应用程序必须不断运行并从服务器接收数据,因此问题是如何做到这一点。假设 AsyncTask 应该在服务内部工作,但我没有找到一个合理的实现。
你好,问题是这样的:有一个EditText,我从中得到一个可以包含西里尔字符的字符串。如何将此字符串转换为带有 \u 代码的转义序列?
可用ListViewAdapter
基于BaseAdapter
:
public class ContactsListAdapter extends BaseAdapter{
private LayoutInflater inflater;
private ArrayList<ContactsListItems> mContactsList = new ArrayList<>();
ContactsListAdapter(Context context, ArrayList<ContactsListItems> users){
mContactsList = users;
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mContactsList.size();
}
@Override
public Object getItem(int i) {
return mContactsList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int i, View convertView, ViewGroup viewGroup) {
View view = convertView;
ViewHolder holder;
ContactsListItems user = getUser(i);
if (view == null){
holder = new ViewHolder();
if (user.getUIN() == -9){
view = inflater.inflate(R.layout.contacts_list_header, viewGroup, false);
//((TextView)view.findViewById(R.id.twGroupName_header)).setText(user.getGroupName());
holder.twGroupName_header = (TextView)view.findViewById(R.id.twGroupName_header);
holder.twGroupName_header.setText(user.getGroupName());
view.setTag(R.id.group_id_contacts_listview, -1);
view.setTag(R.id.parent_group_id_contacts_lisview, user.getParentId());
}else {
if (!user.ismIsGroup()) {
view = inflater.inflate(R.layout.item_people_in_contacts, viewGroup, false);
// ((TextView) view.findViewById(R.id.twContactName)).setText(user.getDisplayName());
// ((TextView) view.findViewById(R.id.twUIN)).setText("UIN:" + user.getUIN().toString());
holder.twContactName = (TextView)view.findViewById(R.id.twContactName);
holder.twContactName.setText(user.getDisplayName());
holder.twUIN = (TextView)view.findViewById(R.id.twUIN);
holder.twUIN.setText("UIN:" + user.getUIN().toString());
view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
} else {
view = inflater.inflate(R.layout.item_group_in_contacts, viewGroup, false);
//((TextView) view.findViewById(R.id.twGroupName_contacts)).setText((user.getGroupName()));
holder.twGroupName_contacts = (TextView)view.findViewById(R.id.twGroupName_contacts);
holder.twGroupName_contacts.setText(user.getGroupName());
view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
}
}
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
return view;
}
private ContactsListItems getUser(int position) {
return ((ContactsListItems) getItem(position));
}
private static class ViewHolder{
TextView twContactName;
TextView twUIN;
TextView twGroupName_contacts;
TextView twGroupName_header;
}
}
以及 ListView 中填充数据的片段:
public class Contacts extends Fragment {
public ContactsListAdapter adapter;
ArrayList<ContactsListItems> items = new ArrayList<>();
String CONTACTS_LIST = "contacts_list";
@Override
public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
final View view = inflater.inflate(R.layout.fragment_contacts, container, false);
SharedPreferences spref = MainPage.contextOfApplication.getSharedPreferences(Consts.APP_PREFERENCES, MainPage.MODE_PRIVATE);
final String sData = spref.getString(CONTACTS_LIST, "");
ContactsListItems Item;
try {
JSONArray contactsListJson = new JSONArray(sData);
for (int i=0; i<contactsListJson.length(); i++){
JSONObject user = contactsListJson.getJSONObject(i);
if (user.getBoolean("IsGroup") && user.getInt("ParentID") == 0) {
Item = new ContactsListItems(user.getInt("UIN"),
user.getInt("Sex"),
user.getInt("ParentID"),
user.getInt("ID"),
user.getString("DisplayName"),
user.getString("GroupName"),
user.getBoolean("TeamLead"),
user.getBoolean("IsGroup"),
user.getInt("GroupID"));
items.add(Item);
}
}
}catch (JSONException e){
}
adapter = new ContactsListAdapter(getActivity(), items);
final ListView listView = (ListView)view.findViewById(R.id.lwContacts);
listView.setAdapter(adapter);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
Integer GroupId = (Integer) view.getTag(R.id.group_id_contacts_listview);
Integer parentGroupId = (Integer) view.getTag(R.id.parent_group_id_contacts_lisview);
ContactsListItems ItemsOnClick;
ArrayList<ContactsListItems> itemsOnClick = new ArrayList<>();
//------------------------------Обработка нажатия на группу-------------------------------------
if (GroupId > 0) {
try {
JSONArray contactsListJson = new JSONArray(sData);
for (int j = 0; j < contactsListJson.length(); j++) {
JSONObject user = contactsListJson.getJSONObject(j);
if (user.getInt("GroupID") == GroupId){
ContactsListItems headerItem = new ContactsListItems(-9,0,user.getInt("ParentID"),0,"", user.getString("GroupName"), false, false, user.getInt("GroupID"));
itemsOnClick.add(headerItem);
}
if (user.getInt("ParentID") == GroupId) {
ItemsOnClick = new ContactsListItems(user.getInt("UIN"),
user.getInt("Sex"),
user.getInt("ParentID"),
user.getInt("ID"),
user.getString("DisplayName"),
user.getString("GroupName"),
user.getBoolean("TeamLead"),
user.getBoolean("IsGroup"),
user.getInt("GroupID"));
itemsOnClick.add(ItemsOnClick);
}
}
} catch (JSONException e) {
e.printStackTrace();
}
ContactsListAdapter onClickAdapter = new ContactsListAdapter(getActivity(), itemsOnClick);
listView.setAdapter(onClickAdapter);
//------------------------------Обработка нажатия на группу-------------------------------------
} else
//------------------------------Обработка нажатия на контакт-------------------------------------
if (GroupId == 0){
Toast t = Toast.makeText(getActivity(), "Contact", Toast.LENGTH_SHORT);
t.show();
//------------------------------Обработка нажатия на контакт-------------------------------------
} else
//------------------------------Обработка нажатия на header--------------------------------------
if (GroupId == -1){
ArrayList<ContactsListItems> itemsOnBackClick = new ArrayList<>();
try {
JSONArray backJson = new JSONArray(sData);
ContactsListItems ItemsOnBackClick;
for (int k=0; k<backJson.length(); k++){
JSONObject backUser = backJson.getJSONObject(k);
if ((backUser.getInt("GroupID") == parentGroupId) && parentGroupId != 0){
ContactsListItems headerItem = new ContactsListItems(-9,0,backUser.getInt("ParentID"),0,"", backUser.getString("GroupName"), false, false, backUser.getInt("GroupID"));
itemsOnBackClick.add(headerItem);
}
if (backUser.getInt("ParentID") == parentGroupId) {
ItemsOnBackClick = new ContactsListItems(backUser.getInt("UIN"),
backUser.getInt("Sex"),
backUser.getInt("ParentID"),
backUser.getInt("ID"),
backUser.getString("DisplayName"),
backUser.getString("GroupName"),
backUser.getBoolean("TeamLead"),
backUser.getBoolean("IsGroup"),
backUser.getInt("GroupID"));
itemsOnBackClick.add(ItemsOnBackClick);
}
ContactsListAdapter onBackClickAdapter = new ContactsListAdapter(getActivity(), itemsOnBackClick);
listView.setAdapter(onBackClickAdapter);
}
}catch (JSONException e){
e.printStackTrace();
}
}
//------------------------------Обработка нажатия на header--------------------------------------
}
});
return view;
}
}
我正在尝试实现一个多级列表。使用少量元素,一切正常,但一旦元素多于手机屏幕上显示的内容,当滚动 ListView 时,元素开始打乱。嵌套在其中的功能会保留,但顺序不会。
有没有人猜到为什么?
像这样更改了 getView() 方法:
public View getView(int i, View convertView, ViewGroup viewGroup) {
View view = convertView;
ViewHolder holder;
ContactsListItems user = getUser(i);
if (view == null){
holder = new ViewHolder();
if (user.getUIN() == -9){
view = inflater.inflate(R.layout.contacts_list_header, viewGroup, false);
holder.twGroupName_header = (TextView)view.findViewById(R.id.twGroupName_header);
view.setTag(R.id.group_id_contacts_listview, -1);
view.setTag(R.id.parent_group_id_contacts_lisview, user.getParentId());
}else {
if (!user.ismIsGroup()) {
view = inflater.inflate(R.layout.item_people_in_contacts, viewGroup, false);
holder.twContactName = (TextView)view.findViewById(R.id.twContactName);
holder.twUIN = (TextView)view.findViewById(R.id.twUIN);
view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
} else {
view = inflater.inflate(R.layout.item_group_in_contacts, viewGroup, false);
holder.twGroupName_contacts = (TextView)view.findViewById(R.id.twGroupName_contacts);
view.setTag(R.id.group_id_contacts_listview, user.getGroupId());
}
}
view.setTag(holder);
} else {
holder = (ViewHolder)view.getTag();
}
if (user.getUIN() == -9){
holder.twGroupName_header.setText(user.getGroupName());
}else {
if (!user.ismIsGroup()) {
holder.twContactName.setText(user.getDisplayName());
holder.twUIN.setText("UIN:" + user.getUIN().toString());
} else {
holder.twGroupName_contacts.setText(user.getGroupName());
}
}
return view;
}
但是现在,滚动时,当我到达列表末尾时,会发生错误:
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference