[英]Is it possible to add different items into android listview
我在我的应用程序中有一个ListView,我从用户电话簿中获取联系人,然后将其显示到ListView中,现在我想要做的就是根据某些条件(例如,我的应用程序)在ListView项目中添加不同的子视图,以检查每个电话簿联系人的可用性。服务器数据库,我要实现的是为该特定联系人添加语音/视频通话按钮,并为数据库中不可用的所有其他联系人添加邀请按钮。
我的条件适用于ListView项目,语音呼叫按钮,视频呼叫按钮和邀请按钮的这三个孩子,而我的条件是如果用户在数据库中可用,那么我只想显示语音/视频呼叫按钮并隐藏邀请按钮,但是如果用户无法使用,则我要显示邀请按钮并隐藏音频/视频通话按钮
列表显示
<?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="match_parent">
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/contacts_listview"/>
</RelativeLayout>
ListView项目
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:orientation="horizontal"
android:minHeight="?android:attr/listPreferredItemHeight"
android:padding="16dp">
<ImageView
android:id="@+id/contact_item_icon"
android:layout_width="50dp"
android:layout_height="50dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:orientation="vertical"
android:paddingLeft="16dp">
<TextView
android:id="@+id/contact_item_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Feel The Light" />
<TextView
android:id="@+id/contact_item_number"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Home" />
</LinearLayout>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_user_audio_call_dark"/>
<ImageButton
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_user_video_call_dark"/>
<Button
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="Invite"
android:background="@drawable/selector_button_green_oval"
android:textColor="@color/white"/>
</LinearLayout>
ContactsFragment
public class ContactsAdapter extends ArrayAdapter<ContactItem> {
private static final String LOG_TAG = ContactsAdapter.class.getSimpleName();
public ContactsAdapter(Activity context, List<ContactItem> contactItems) {
super(context, 0, contactItems);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ContactItem contactItem = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.contact_list_item, parent, false);
}
ImageView contactImage = (ImageView) convertView.findViewById(R.id.contact_item_icon);
contactImage.setImageResource(contactItem.contactImage);
TextView contactName = (TextView) convertView.findViewById(R.id.contact_item_name);
contactName.setText(contactItem.contactName);
TextView contactNumber = (TextView) convertView.findViewById(R.id.contact_item_number);
contactNumber.setText(contactItem.contactNumber);
return convertView;
}
}
ContactsFragment
public class ContactsListFragment extends Fragment {
private ContactsAdapter contactsAdapter;
public static ContactsListFragment newInstance() {
return new ContactsListFragment();
}
public ContactsListFragment() {
}
ArrayList<String> contactName = new ArrayList<>();
ArrayList<String> contactNumber = new ArrayList<>();
ArrayList<ContactItem> contactsAvailable = new ArrayList<>();
ArrayList<ContactItem> contactsInvite = new ArrayList<>();
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Cursor cursor = getActivity().getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null
);
String currentNumber = "";
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
number = number.replaceAll(" ", "");
char c = number.charAt(0);
char c1 = number.charAt(1);
String s = Character.toString(c)+Character.toString(c1);
if (s.equals("00")) {
number = number.replaceAll("00", "+");
}
if (number.length() == 12) {
number = "+" + number;
}
if (number.length() == 13) {
if (!currentNumber.equals(number)) {
contactName.add(name);
contactNumber.add(number);
}
}
currentNumber = number;
}
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
final View rootView = inflater.inflate(R.layout.fragment_contacts_list, container, false);
QBPagedRequestBuilder pagedRequestBuilder = new QBPagedRequestBuilder();
pagedRequestBuilder.setPage(1);
pagedRequestBuilder.setPerPage(50);
QBUsers.getUsersByLogins(contactNumber, pagedRequestBuilder, new QBEntityCallback<ArrayList<QBUser>>() {
@Override
public void onSuccess(ArrayList<QBUser> qbUsers, Bundle bundle) {
for (int i = 0; i < qbUsers.size(); i++) {
ContactItem contactItem = new ContactItem(qbUsers.get(i).getFullName(), qbUsers.get(i).getLogin(), R.drawable.ic_launcher);
contactsAvailable.add(contactItem);
}
contactsAdapter = new ContactsAdapter(getActivity(), contactsAvailable);
ListView listView = (ListView) rootView.findViewById(R.id.contacts_listview_available);
listView.setAdapter(contactsAdapter);
}
@Override
public void onError(QBResponseException e) {
Toast.makeText(getActivity(), e.toString(), Toast.LENGTH_LONG).show();
}
});
return rootView;
}
}
您可以在ContactItem类上添加一个标志,并将其设置为true或false(如果它在数据库中可用),然后根据此标志设置适配器中按钮的可见性。
尝试这个:
ContactItem.java
类中添加一个boolean
标志isAvailableInDB
。 phonebook
获取联系人列表,并与服务器database
进行逐一检查。 contactItem
在你的存在database
刚刚成立标志isAvailableInDB
为true
oterwise false
为contactItem
。 contactItem
添加到ArrayList
ContactsAdapter
并将其设置为ListView
getView()
方法中添加一个条件,以检查contactItem
标志isAvailableInDB
。 如果为true
,则显示语音/视频呼叫按钮并隐藏邀请按钮;如果为false
,则显示邀请按钮并隐藏语音/视频呼叫按钮。 给XML按钮的ID:
<ImageButton
android:id="@+id/button_voice_call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_user_audio_call_dark"/>
<ImageButton
android:id="@+id/button_video_call"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_user_video_call_dark"/>
<Button
android:id="@+id/button_invite"
android:layout_width="wrap_content"
android:layout_height="30dp"
android:text="Invite"
android:background="@drawable/selector_button_green_oval"
android:textColor="@color/white"/>
在适配器的getView()方法中:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ContactItem contactItem = getItem(position);
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.contact_list_item, parent, false);
}
ImageView contactImage = (ImageView) convertView.findViewById(R.id.contact_item_icon);
contactImage.setImageResource(contactItem.contactImage);
TextView contactName = (TextView) convertView.findViewById(R.id.contact_item_name);
contactName.setText(contactItem.contactName);
TextView contactNumber = (TextView) convertView.findViewById(R.id.contact_item_number);
contactNumber.setText(contactItem.contactNumber);
ImageButton buttonVoiceCall= (ImageButton) convertView.findViewById(R.id.button_voice_call);
ImageButton buttonVideoCall= (ImageButton) convertView.findViewById(R.id.button_video_call);
Button buttonVoiceCall= (Button) convertView.findViewById(R.id.button_invite);
if(contactItem.getIsAvailableInDB())
{
buttonVoiceCall.setVisibility(View.VISIBLE);
buttonVideoCall.setVisibility(View.VISIBLE);
buttonInvite.setVisibility(View.GONE);
}
else
{
buttonVoiceCall.setVisibility(View.GONE);
buttonVideoCall.setVisibility(View.GONE);
buttonInvite.setVisibility(View.VISIBLE);
}
return convertView;
}
希望对您有帮助〜
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.