简体   繁体   中英

Is it possible to add different items into android listview

i have a ListView in my application, i fetch contacts from user phonebook then displays them into ListView, now what i want to do is to add different child views into ListView item based on some condition like my application check each phonebook contact for it's availability on server database and what i want to achieve is to add voice/video call buttons for that particular contact and add invite button for all other contacts that are not available in database.

My condition applies on these three child's of ListView item, voice call button, video call button and invite button and my condition is if user is available in database then i only want to display voice/video call button and hide invite button but if the user is not available then i wan to display invite button and hide audio/video call buttons

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 Item

<?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(如果它在数据库中可用),然后根据此标志设置适配器中按钮的可见性。

Try this:

  1. Add a boolean flag isAvailableInDB in your ContactItem.java class.
  2. Get contact list from your phonebook and check one by one with your server database .
  3. If a contactItem exist in your database just set flag isAvailableInDB as true oterwise false for that contactItem .
  4. After that add contactItem to ArrayList
  5. Create ContactsAdapter and set it to ListView
  6. Finally, add a condition in your adapter's getView() method to check the contactItem flag isAvailableInDB . If true , show voice/video call button & hide invite button and if false , show invite button & hide voice/video call button.

Give an id to XML button's:

<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"/>

In your adapter's getView() method:

@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;
}

Hope this will help you~

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM