Android onListItemClick:如何获取被点击的ListView项中显示字段的对象?

Android onListItemClick: How to get an object whose fields are displayed in the ListView item which was clicked?

我有一个 ArrayList 个 class MyClass 的对象,每个对象都有四个字段(即 firstItemsecondItemthirdItemfourthItem),其中前三个需要显示在ListFragmentListView中。 为此,我扩展了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.LoaderCallBacksonLoadFinished() 方法:

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

在此之后,您必须将 DetailsFragmentnewInstance() 中传递的参数类型更改为 String 并简单地显示它。