Преобразование Arraylist из java.utils в kotlin.collections.arraylist - PullRequest
0 голосов
/ 30 мая 2018

Мой проект содержит два класса: один в java, другой в kotlin.Я вызываю метод в java-классе из kotlin, но метод возвращает arraylist в формате java.utils.arraylist, но за исключением его необходимости в формате kotlin.collections.arraylist.Так есть ли способ, если бы я мог преобразовать или другой способ принять массив из Java в kotlin

класс kotlin

class contactAllFragment : Fragment() {


@BindView(R.id.contacts_lv) lateinit var contact_lv: ListView

var al = ArrayList<HashMap<String,String>>()
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                          savedInstanceState: Bundle?): View? {

    var view: View
    view = inflater.inflate(R.layout.fragment_contact_all,container,false)
    ButterKnife.bind(this,view)


    //load all contacts
    al = LoadAllContacts(activity.application.contentResolver,
            activity.applicationContext)
            .loadContacts()

    var adapter: SimpleAdapter = SimpleAdapter(context,al,R.layout.listview_style,LoadAllContacts.keys,LoadAllContacts.ids);
    if(contact_lv!=null)
        contact_lv.adapter(adapter)




    // Inflate the layout for this fragment
    return view
}

@OnItemClick(R.id.contacts_lv)
fun onItemClick(parent: AdapterView<?>,  position){
    var hm_element: HashMap<String,String> = al.get(position)
    var name: String = hm_element.get(LoadAllContacts.keys[0])
    var number: String = hm_element.get(LoadAllContacts.keys[1])
}
}

следующий код Java

public class LoadAllContacts {

//parameter to import
private ContentResolver contentResolver;
private Context context;

public static ArrayList al=null;

private Cursor cursor_Android_Contacts = null;
public static final String[] keys = {"name"};
public static final int[] ids = {R.id.contact_name};

public LoadAllContacts( ContentResolver contentResolver, Context context) {
    this.contentResolver = contentResolver;
    this.context = context;
}

public ArrayList loadContacts() {

    al = new ArrayList();

    //to get connection to database in android we use content resolver
    //get all contacts
    try {
        //sort the list while taking contact_id itself

        cursor_Android_Contacts = contentResolver.query(ContactsContract.Contacts.CONTENT_URI,
                null,
                null,
                null,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
    } catch (Exception e) {

        Log.e("error in contact", e.getMessage());
    }

    //check if it has contacts
    if (cursor_Android_Contacts.getCount() > 0) {


        if (cursor_Android_Contacts.moveToFirst()) {

            do {
            //get the object of class android contact to store values and string to get the data from android database
                HashMap hm = new HashMap();
                String contact_id = cursor_Android_Contacts.getString(
                        cursor_Android_Contacts.getColumnIndex(
                                ContactsContract.Contacts._ID));
                String contact_display_name = cursor_Android_Contacts.getString(cursor_Android_Contacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                hm.put(keys[0], contact_display_name);
                int hasPhoneNumber = Integer.parseInt(cursor_Android_Contacts.getString(cursor_Android_Contacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)));
                if (hasPhoneNumber > 0) {

                    Cursor phoneCursor = contentResolver.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " =? ",
                            new String[]{contact_id},
                            null
                    );

                    if (phoneCursor.moveToFirst()) {
                        String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        //hm.put(keys[1], phoneNumber);
                    }

                    phoneCursor.close();
                }
                al.add(hm);
            } while (cursor_Android_Contacts.moveToNext());
        }
        return al;
    }
    return al;
}
}

1 Ответ

0 голосов
/ 31 мая 2018

kotlin.collections.ArrayList - это просто typealias для java.util.ArrayList в JVM, поэтому вы можете передать один, где ожидается другой.

Проблема здесь может заключаться в том, что вы используете raw ArrayList введите на Java.В Kotlin это будет выглядеть как ArrayList<*>, то есть параметризовано неизвестным типом, и, следовательно, его нельзя будет присвоить ArrayList<HashMap<String, String>>.

В этом случае вы должны будете использовать непроверенное приведение в Kotlin:

al = loadContacts() as ArrayList<HashMap<String, String>>

Или - это лучше - вы должны указать параметры типа в вашем методе Java:

public ArrayList<HashMap<String, String>> loadContacts() { ... }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...