在android List界面中,
我有
private List<Contact> contacts;
还有,
Contact contact = contacts.get(position);
但是get是List接口中定义的抽象方法。
那怎么可能写呢?
完整代码:
public class ListViewActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
ListView listView = (ListView) findViewById(R.id.list);
listView.setAdapter(new ContactsAdapter(this));
}
class ContactsAdapter extends ArrayAdapter<Contact> {
private List<Contact> contacts;
public ContactsAdapter(Context context) {
super(context, -1);
this.contacts = MockDataGenerator.getMockContacts(1000);
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView,
@NonNull ViewGroup parent) {
ViewHolder viewHolder;
if (convertView == null) {
convertView = LayoutInflater.from(getContext())
.inflate(R.layout.contact_item, parent, false);
viewHolder = new ViewHolder(convertView);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Contact contact = contacts.get(position);
viewHolder.nameTextView.setText(contact.getName());
viewHolder.mobileTextView.setText(contact.getMobile());
viewHolder.landlineTextView.setText(contact.getLandline());
return convertView;
}
@Override
public int getCount() {
return this.contacts.size();
}
class ViewHolder {
private TextView nameTextView;
private TextView mobileTextView;
private TextView landlineTextView;
public ViewHolder(@NonNull View view) {
this.nameTextView = (TextView)view
.findViewById(R.id.name_text_view);
this.mobileTextView = (TextView)view
.findViewById(R.id.mobile_text_view);
this.landlineTextView = (TextView)view
.findViewById(R.id.landline_text_view);
}
}
}
}
MockContacts生成器:
public static List<Contact> getMockContacts(int length) {
ArrayList<Contact> mockContacts = new ArrayList<>();
for (int i = 0; i < length; i++) {
mockContacts.add(getMockContact());
}
return mockContacts;
}
答案 0 :(得分:2)
MockDataGenerator.getMockContacts(1000)
返回扩展List<T>
的具体类型的实例(因此必须为get()
定义实现)。当您调用contacts.get(position)
时,这是一个虚方法调用,JVM将使用MockDataGenerator.getMockContacts(1000)
返回的类型提供的实现。
答案 1 :(得分:0)
您的contact
列表在构造函数中初始化:
public ContactsAdapter(Context context) {
super(context, -1);
this.contacts = MockDataGenerator.getMockContacts(1000);
}
所以在这里我假设您的MockDataGenerator
生成了一千个模拟联系人的列表
答案 2 :(得分:0)
它返回List接口的抽象方法,因为接口定义了方法。但这并不意味着在运行时(执行程序时),它就完全按照这种方法执行。相反,#map {
height: 280px;
width: 500px;
}
@media screen and (max-width: 600px) {
#map {
height: 140px;
width: 250px;
}
}
;`指的是哪个类导入这个确切的接口。例如,有两种广泛使用的List实现:ArrayList和LinkedList。它们都实现了List接口并提供了它们自己的方法实现。 get(i)是这些方法之一。让我告诉你实践:
List<Contact> contacts
}
这里public class Example {
private static List<String> stringList = null;
public static void main(String[] args) {
initList();
final String s = stringList.get(0);
}
public static void initList() {
stringList = new ArrayList<>();
stringList.add("OneString");
stringList.add("SecondString");
}
也返回抽象方法get。但是在运行时它会调用ArrayList的方法,因为ArrayList是对象的类型,而ArrayList会覆盖此方法。