如何在自定义对象的android中使用ArrayAdapter

我如何在ListView中使用自定义对象的属性。 如果我用一个string列表实现一个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时。

ArrayAdapter显示toString()方法返回的值,因此您需要在自定义Object类中重写此方法以返回所需的String。 你还需要至less有一个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,parsing它,然后调用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类…如何创build这个?

第一步

获取你的项目并创build一个新的课程。 然后用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,如果需要的话放在其他的里面…在我的情况下我需要listview …我的例子:

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

超级方法需要你的活动,自定义布局(如果你有)和你的数组。

第三

声明一个静态类或创build一个新的,如果你有一个自定义的行布局。 我的例子有一个静态类:

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

我想这是你需要的,如果你需要更多的信息或者同样的build议,我会尽力帮助你…祝你好运,Eduardo!

 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以将单个对象显示在视图中的某个位置。