如何在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));
}
});
有一个类似的问题here,但这不是我需要的,因为我只需要在列表视图中显示标题,然后点击提取网址。
答案 0 :(得分:24)
ArrayAdapter显示toString()
方法返回的值,因此您需要在自定义Object类中重写此方法以返回所需的String。您还需要至少有一个URL的getter方法,以便您可以在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
,因为这是您的适配器示例所使用的。
答案 1 :(得分:4)
如果你想使用自定义类的方法,你需要实现一个custor ArrayAdapter类......如何创建它?
第一步
获取您的项目并创建一个新课程。然后用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;
}
超级方法需要您的活动,自定义布局(如果有的话)和您的阵列。
<强>第三强>
如果您有自定义行布局,则声明静态类或创建新类。我的例子有一个静态类:
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());
}
}
};
}
我认为这是你需要的,如果你需要更多的信息或相同的建议,我会尽力帮助你...祝你好运,爱德华多!
答案 2 :(得分:0)
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));
}
});
答案 3 :(得分:-1)
您需要覆盖适配器的getView,以在视图中的某个位置显示单个对象。