【问题标题】:Is it possible to add different items into android listview是否可以将不同的项目添加到 android listview
【发布时间】:2017-03-26 14:59:34
【问题描述】:

我的应用程序中有一个 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>

列表视图项

<?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>

联系人片段

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

联系人片段

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;

}
}

【问题讨论】:

  • 请在您的文本中添加一个问题。您已经描述了您想要做什么并添加了代码,但没有解释什么不起作用
  • 我已经更新了我的问题

标签: android listview fragment adapter


【解决方案1】:

试试这个:

  1. ContactItem.java 类中添加boolean 标志isAvailableInDB
  2. 从您的phonebook获取联系人列表,并与您的服务器database一一核对。
  3. 如果contactItem 存在于您的database 中,只需将标志isAvailableInDB 设置为truefalsecontactItem
  4. 之后将contactItem 添加到ArrayList
  5. 创建ContactsAdapter并将其设置为ListView
  6. 最后,在适配器的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;
}

希望对你有帮助~

【讨论】:

  • @user7661245 如果我的回答似乎有用,请投赞成票。提前致谢
【解决方案2】:

您可以在 ContactItem 类上添加一个标志并将其设置为 true 或 false,如果它在数据库中可用,然后根据此标志设置适配器中按钮的可见性。

【讨论】:

    猜你喜欢
    • 2013-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多