Intereting Posts
Как сохранить положение прокрутки RecyclerView с помощью RecyclerView.State? Когда дочерние представления добавляются в Layout / ViewGroup из XML Локализация Android Как поделиться изображением + текст, используя намерение Share в android Список атрибутов в eglCreateContext Использование нескольких сетевых интерфейсов в приложении Windows – менеджер Android SDK не перечисляет какие-либо платформы или пакеты для установки Как добавить «Icon Icon Pack» в Android Studio Android, прозрачный суб-GLSurfaceView в макете? Как реализовать перетаскиваемую карту, например, uber android, Update with change location Пользовательский inputType / key, установленный для мягкой клавиатуры Android Android – нижний колонтитул прокручивается с экрана при использовании в CoordinatorLayout Конфликт между привязкой данных Android и Guava вызывает ошибку ProGuard Обращение к прессе при использовании фрагментов в Android Как установить разрешения в широковещательном отправителе и получателе в android

Как использовать ArrayAdapter в android пользовательских объектов

Как я могу использовать свойства настраиваемого объекта в Listview. Если я реализую ArrayAdapter со списком строк, он отлично отображает ListView, но когда я использую список пользовательских объектов, он просто выводит адрес памяти.

Код, который у меня есть до сих пор:

ArrayList<CustomObject> allObjects = new ArrayList<>(); allObjects.add("title", "http://url.com")); ArrayAdapter<NewsObject> adapter = new ArrayAdapter<NewsObject>(this, android.R.layout.simple_list_item_1, android.R.id.text1, allNews); // Assign adapter to ListView listView.setAdapter(adapter); listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { Uri uri = Uri.parse( "http://www.google.com" ); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } }); 

Здесь есть аналогичный вопрос, но это не то, что мне нужно, так как мне просто нужно показать название в виде списка и когда они нажимают на извлечение URL-адреса.

Solutions Collecting From Web of "Как использовать ArrayAdapter в android пользовательских объектов"

ArrayAdapter отображает значение, возвращаемое методом toString() , поэтому вам необходимо переопределить этот метод в вашем пользовательском классе Object, чтобы вернуть нужную строку. Вам также необходимо иметь хотя бы метод getter для URL-адреса, поэтому вы можете получить его в событии click.

 public class NewsObject { private String title; private String url; public NewsObject(String title, String url) { this.title = title; this.url = url; } public String getUrl() { return url; } @Override public String toString() { return title; } ... } 

В onItemClick() position будет индексом в ArrayList ваших пользовательских объектов, соответствующих выбранному элементу списка. Получите URL-адрес, проанализируйте его и вызовите startActivity() .

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { NewsObject item = allNews.get(position); String url = item.getUrl(); Uri uri = Uri.parse(url); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } }); 

Обратите внимание: я предположил, что ваш пользовательский класс – NewsObject , так как это то, что используется с вашим примером адаптера.

Если вы хотите использовать методы своего пользовательского класса, вам нужно реализовать класс ArrayAdapter custor … Как это создать?

Первый шаг

Получите ваш проект и создайте новый класс. Затем расширяет класс с помощью ArrayAdapter<YourObject>{} и объявляет внутри ваших атрибутов, которые вам нужны … Мой пример:

 public class Room_Adapter extends ArrayAdapter<Room_Object> { //Declaration of Atributes private ArrayList<Room_Object> Rooms_Array; private final Activity context; private final ListView lvBuinding; 

второй

Объявите конструктор для этого класса, всегда вам нужен Activity и ArrayList, если нужно, внутри других. В моем случае мне нужен список … Мой пример:

 public Room_Adapter(Activity context, ArrayList<Room_Object> Rooms_Array,ListView lvBuinding) { super(context, R.layout.room_layout, Rooms_Array); this.context = context; this.Rooms_Array = Rooms_Array; this.lvBuinding = lvBuinding; } 

Супер метод – это ваша деятельность, настраиваемый макет (если он у вас есть) и ваш массив.

В третьих

Объявите статический класс или создайте новый, если у вас есть собственный макет строки. Мой пример имеет статический класс:

 public static class Room_View{ //Declaration of Atributes TextView RoomName; ImageView RoomState; TextView NoTroubles; Button btnRoomRow; ImageButton btnShowRoomTasks; ImageButton btnAddTasks; RelativeLayout RowLayout; } 

четвертый

Переопределить метод getView.

 @Override public View getView(int position, View ConvertView, ViewGroup parent) { //Declaration of Variables Room_View rowView; //Custom static class with controls LayoutInflater inflator = context.getLayoutInflater(); if (ConvertView == null) { rowView = new Room_View(); ConvertView = inflator.inflate(R.layout.room_layout,null,true); //Inflate your view with your custom view. rowView.RoomName = (TextView) ConvertView.findViewById(R.id.txtvRoom); rowView.RoomState = (ImageView) ConvertView.findViewById(R.id.ivRoomState); rowView.NoTroubles = (TextView) ConvertView.findViewById(R.id.txtvNoTroubles); rowView.btnRoomRow = (Button) ConvertView.findViewById(R.id.btnRoomRow); rowView.btnAddTasks = (ImageButton) ConvertView.findViewById(R.id.btnAddTask); rowView.btnShowRoomTasks = (ImageButton) ConvertView.findViewById(R.id.btnShowRoomTasks); rowView.RowLayout = (RelativeLayout) ConvertView.findViewById(R.id.rowLayout); ConvertView.setTag(rowView); } else { rowView = (Room_View) ConvertView.getTag(); } //Here custom your control stats Room_Object Room = Rooms_Array.get(position); rowView.RoomName.setText(Room.getRoomName()); rowView.NoTroubles.setVisibility(View.INVISIBLE); rowView.btnShowRoomTasks.setClickable(true); rowView.btnShowRoomTasks.setImageResource(R.drawable.list_3a4b66_50); rowView.btnShowRoomTasks.setOnClickListener(OnShowTasksClickListener); //This is for add ClickListiner in my buttons... rowView.btnAddTasks.setOnClickListener(OnAddTasksClickListener); rowView.btnRoomRow.setOnClickListener(OnAddTasksClickListener); if(Room.getStatus().equals("Checked")){ rowView.RowLayout.setBackgroundColor(0xFFC7E6C7); rowView.btnShowRoomTasks.setClickable(false); rowView.btnShowRoomTasks.setImageResource(R.drawable.list_999999_50); rowView.RoomState.setImageResource(R.drawable.check_3ebf4b_50); } else if(Room.getStatus().equals("Blocked")){ rowView.RowLayout.setBackgroundColor(0xFFDBC3E5); rowView.RoomState.setImageResource(R.drawable.key_9330e0_50); } else if(Room.getStatus().equals("Dirty")){ rowView.RowLayout.setBackgroundColor(0xfffceedb); rowView.RoomState.setImageResource(R.drawable.icon_housekeeping_3_yellow); } else if(Room.getStatus().equals("Troubled")){ rowView.RowLayout.setBackgroundColor(0xFFF4CECD); rowView.RoomState.setImageResource(R.drawable.wrench_eb3232_50); rowView.NoTroubles.setVisibility(View.VISIBLE); try { rowView.NoTroubles.setText(Integer.toString(Room.getNoTasks())); } catch (Exception ex){ Log.e("-- Error --",ex.getMessage()); } } // //Pay attention ************************************************* // //Now if you needs to use your custom external class this is the site, now imagine that you need gets string from your custom class in the text view, then: //Declare class CustomClass object = new CustomClass(); rowView.(CUSTOM CONTROL FROM YOUR STATIC CLASS).(METHOD OF CONTROL)(object.(CUSTOM METHOD OF YOUR OBJECT)); //For example If you follows my sample then: rowView.NoTroubles.setText(object.getNumberOfTroubles().toString); return ConvertView; } //Listener Methods for my button controls private View.OnClickListener OnShowTasksClickListener = new View.OnClickListener() { @Override public void onClick(View v) { int positionSelected = lvBuinding.getPositionForView((View) v.getParent()); int totalRooms = lvBuinding.getCount() - 1; int actualRoom = totalRooms - positionSelected; try{ //Your code; } catch (Exception ex){ Log.e("-- CustomError --", ex.getMessage()); } } }; private View.OnClickListener OnAddTasksClickListener = new View.OnClickListener() { @Override public void onClick(View v) { int positionSelected = lvBuinding.getPositionForView((View) v.getParent()); int totalRooms = lvBuinding.getCount() - 1; int actualRoom = totalRooms - positionSelected; try{ //Your code; } catch (Exception ex){ Log.e("-- CustomError --", ex.getMessage()); } } }; } 

Я думаю, что это то, что вам нужно, если вам нужна дополнительная информация или тот же совет, и я стараюсь помочь вам … Удачи, Эдуардо!

 listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { CustomObject obj = allObjects.get(position); //Now use obj to access the property Uri uri = Uri.parse( "http://www.google.com" ); startActivity(new Intent(Intent.ACTION_VIEW, uri)); } }); 

Вам необходимо переопределить getView вашего адаптера, чтобы отобразить отдельный объект в позиции в вашем представлении.