Android onListItemClick:如何获取被点击的ListView项中显示字段的对象?
Android onListItemClick: How to get an object whose fields are displayed in the ListView item which was clicked?
我有一个 ArrayList
个 class MyClass
的对象,每个对象都有四个字段(即 firstItem
、secondItem
、thirdItem
和fourthItem
),其中前三个需要显示在ListFragment
的ListView
中。 为此,我扩展了ArrayAdapter
,并覆盖了它的getView()
方法,如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view = layoutInflater.inflate(
R.layout.myFragment_listview_item, parent, false);
} else {
view = convertView;
}
MyClass myClassItem = getItem(position);//******But this method is inside Adapter
((TextView) view
.findViewById(R.id.myclassListFragment_ListViewItem1))
.setText(myClassItem.firstItem);
((TextView) view
.findViewById(R.id.myclassListFragment_ListViewItem2))
.setText(myClassItem.secondItem);
((TextView) view
.findViewById(R.id.myclassListFragment_ListViewItem3))
.setText(myClassItem.thirdItem);
return view;
}
但是当用户单击 ListView
中的项目时,应显示其他字段显示为该单击的列表视图项目的对象的 fourthItem
字段(在 TextView
) 在单独的 Fragment
(detailsFragment
).
程序在点击 ListView
中的项目时添加新片段,如下所示,但问题是如何获取 fourthItem
字段的值对于 MyClass
对象,其对应的 ListView
项已被用户单击,因此我可以将其设置在 detailsFragment
?[ 中的 TextView
中=35=]
在前面提到的ListFragment
:
ListFragment
实现了LoaderManager.LoaderCallBacks<List<MyClass>>
,这意味着包含MyClass
对象的List
传递给了LoaderManager.LoaderCallBacks
的onLoadFinished()
方法:
@Override
public void onLoadFinished(Loader<List<MyClass>> loader, List<MyClass> dataList) {
customArrayListAdapter.setData(dataList);
if (isResumed()) {setListShown(true);} else {setListShownNoAnimation(true);}
}
我们有 onListItemClick()
方法,它实例化新的 detailsFragment
以在其中显示 fourthItem
:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
showDetailsFragment(position);
}
private void showDetailsFragment(int index) {
listViewItemPosition = index;
DetailsFragment detailsFragment = DetailsFragment.newInstance(index);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.myActivity_frameLayout1, detailsFragment);
fragmentTransaction.commit();
}
通过使用 setTag()
和 getTag()
机制让您的视图记住一些东西,它可以是一个对象、一个整数、一个字符串或任何您喜欢的东西。
在 getView() 中设置
view.SetTag(myClassItem );
在 onItemClickListener() 中使用 getTag() 从项目
中检索数据
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
MyClass class = (MyClass) v.getTag();
}
您可以使用 getListAdapter
调用适配器的 getItem
方法从 ListView 中获取选定的行项目对象:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
MyClass class = (MyClass)getListAdapter().getItem(position);
}
像这样改变你的方法
private void showDetailsFragment(int index) {
String fourthItem = ((MyClass)getListAdapter().getItem(index)).fourthItem;
DetailsFragment detailsFragment = DetailsFragment.newInstance(fourthItem);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.myActivity_frameLayout1, detailsFragment);
fragmentTransaction.commit();
}
在此之后,您必须将 DetailsFragment
的 newInstance()
中传递的参数类型更改为 String
并简单地显示它。
我有一个 ArrayList
个 class MyClass
的对象,每个对象都有四个字段(即 firstItem
、secondItem
、thirdItem
和fourthItem
),其中前三个需要显示在ListFragment
的ListView
中。 为此,我扩展了ArrayAdapter
,并覆盖了它的getView()
方法,如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
if (convertView == null) {
view = layoutInflater.inflate(
R.layout.myFragment_listview_item, parent, false);
} else {
view = convertView;
}
MyClass myClassItem = getItem(position);//******But this method is inside Adapter
((TextView) view
.findViewById(R.id.myclassListFragment_ListViewItem1))
.setText(myClassItem.firstItem);
((TextView) view
.findViewById(R.id.myclassListFragment_ListViewItem2))
.setText(myClassItem.secondItem);
((TextView) view
.findViewById(R.id.myclassListFragment_ListViewItem3))
.setText(myClassItem.thirdItem);
return view;
}
但是当用户单击 ListView
中的项目时,应显示其他字段显示为该单击的列表视图项目的对象的 fourthItem
字段(在 TextView
) 在单独的 Fragment
(detailsFragment
).
程序在点击 ListView
中的项目时添加新片段,如下所示,但问题是如何获取 fourthItem
字段的值对于 MyClass
对象,其对应的 ListView
项已被用户单击,因此我可以将其设置在 detailsFragment
?[ 中的 TextView
中=35=]
在前面提到的ListFragment
:
ListFragment
实现了LoaderManager.LoaderCallBacks<List<MyClass>>
,这意味着包含MyClass
对象的List
传递给了LoaderManager.LoaderCallBacks
的onLoadFinished()
方法:
@Override
public void onLoadFinished(Loader<List<MyClass>> loader, List<MyClass> dataList) {
customArrayListAdapter.setData(dataList);
if (isResumed()) {setListShown(true);} else {setListShownNoAnimation(true);}
}
我们有 onListItemClick()
方法,它实例化新的 detailsFragment
以在其中显示 fourthItem
:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
showDetailsFragment(position);
}
private void showDetailsFragment(int index) {
listViewItemPosition = index;
DetailsFragment detailsFragment = DetailsFragment.newInstance(index);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.myActivity_frameLayout1, detailsFragment);
fragmentTransaction.commit();
}
通过使用 setTag()
和 getTag()
机制让您的视图记住一些东西,它可以是一个对象、一个整数、一个字符串或任何您喜欢的东西。
在 getView() 中设置
view.SetTag(myClassItem );
在 onItemClickListener() 中使用 getTag() 从项目
中检索数据@Override
public void onListItemClick(ListView l, View v, int position, long id) {
MyClass class = (MyClass) v.getTag();
}
您可以使用 getListAdapter
调用适配器的 getItem
方法从 ListView 中获取选定的行项目对象:
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
MyClass class = (MyClass)getListAdapter().getItem(position);
}
像这样改变你的方法
private void showDetailsFragment(int index) {
String fourthItem = ((MyClass)getListAdapter().getItem(index)).fourthItem;
DetailsFragment detailsFragment = DetailsFragment.newInstance(fourthItem);
FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
fragmentTransaction.replace(R.id.myActivity_frameLayout1, detailsFragment);
fragmentTransaction.commit();
}
在此之后,您必须将 DetailsFragment
的 newInstance()
中传递的参数类型更改为 String
并简单地显示它。