Кодирование:
public class Test {
public static void main(String args[]) {
ArrayList<Student> a = new ArrayList<Student>();
a.add(new Student("Steve", 12, "Daniel"));
a.add(new Student("Sachin", 10, "Tendulkar"));
System.out.println(a);
display(a);
}
static void display(ArrayList<Student> stu) {
stu.add(new Student("Yuvi", 12, "Bhajji"));
System.out.println(stu);
}
}
Student.java:
public class Student {
public String name;
public int id;
public String email;
Student() {
}
Student(String name, int id, String email) {
this.name = name;
this.id = id;
this.email = email;
}
public String toString(){ //using these toString to avoid the output like this [com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
return name+" "+id+" "+email;
}
public String getName(){
return name;
}
public void setName(String name){
this.name=name;
}
public int getId(){
return id;
}
public void setId(int id){
this.id=id;
}
public String getEmail(){
return email;
}
public void setEmail(String email){
this.email=email;
}
}
Выход:
[Стив 12 Даниил, Сахин 10 Тендулкар]
[Steve 12 Daniel, Sachin 10 Tendulkar, Yuvi 12 Bhajji]
blockquote>Если вы не используете toString () в классе Pojo (Student.java), вы будете получите выход, например
[com.steve.test.Student@6e1408, com.steve.test.Student@e53108]
. Чтобы избежать такой проблемы, мы используем метод toString ().
Понять, почему ContainerFromItem
не работал на меня, здесь некоторый фон. Обработчик событий, где мне была нужна эта функциональность, похож на это:
var item = new SomeListItem();
SomeList.Add(item);
ListViewItem = SomeList.ItemContainerGenerator.ContainerFromItem(item); // returns null
После Add()
эти ItemContainerGenerator
сразу не создает контейнер, потому что CollectionChanged
событие могло быть обработано на non-UI-thread. Вместо этого это запускает асинхронный вызов и ожидает потока UI к обратному вызову, и выполните фактическое поколение управления ListViewItem.
, Чтобы быть уведомленным то, когда это происходит, эти ItemContainerGenerator
, выставляет StatusChanged
событие, которое запущено после того, как все Контейнеры сгенерированы.
Теперь я должен слушать это событие и решить ли управление в настоящее время want's для установки фокуса или нет.
Как другие отметили, myBox TextBox не может быть найден путем вызова FindName на ListView. Однако можно получить ListViewItem, который в настоящее время выбирается, и используйте класс VisualTreeHelper для получения TextBox от ListViewItem. Сделать так выглядит примерно так:
private void myList_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
if (myList.SelectedItem != null)
{
object o = myList.SelectedItem;
ListViewItem lvi = (ListViewItem)myList.ItemContainerGenerator.ContainerFromItem(o);
TextBox tb = FindByName("myBox", lvi) as TextBox;
if (tb != null)
tb.Dispatcher.BeginInvoke(new Func<bool>(tb.Focus));
}
}
private FrameworkElement FindByName(string name, FrameworkElement root)
{
Stack<FrameworkElement> tree = new Stack<FrameworkElement>();
tree.Push(root);
while (tree.Count > 0)
{
FrameworkElement current = tree.Pop();
if (current.Name == name)
return current;
int count = VisualTreeHelper.GetChildrenCount(current);
for (int i = 0; i < count; ++i)
{
DependencyObject child = VisualTreeHelper.GetChild(current, i);
if (child is FrameworkElement)
tree.Push((FrameworkElement)child);
}
}
return null;
}
Мы используем подобную технику с новым datagrid WPF:
Private Sub SelectAllText(ByVal cell As DataGridCell)
If cell IsNot Nothing Then
Dim txtBox As TextBox= GetVisualChild(Of TextBox)(cell)
If txtBox IsNot Nothing Then
txtBox.Focus()
txtBox.SelectAll()
End If
End If
End Sub
Public Shared Function GetVisualChild(Of T As {Visual, New})(ByVal parent As Visual) As T
Dim child As T = Nothing
Dim numVisuals As Integer = VisualTreeHelper.GetChildrenCount(parent)
For i As Integer = 0 To numVisuals - 1
Dim v As Visual = TryCast(VisualTreeHelper.GetChild(parent, i), Visual)
If v IsNot Nothing Then
child = TryCast(v, T)
If child Is Nothing Then
child = GetVisualChild(Of T)(v)
Else
Exit For
End If
End If
Next
Return child
End Function
техника должна быть довольно применимой для Вас, просто передать Ваш listviewitem, после того как это сгенерировано.