【问题标题】:Android onListItemClick: How to get an object whose fields are displayed in the ListView item which was clicked?Android onListItemClick:如何获取其字段显示在单击的ListView项目中的对象?
【发布时间】:2015-01-09 03:25:51
【问题描述】:

我有一个ArrayListMyClass 的对象,每个对象有四个字段(即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中的一个项目时添加新片段如下,但问题是我如何获取MyClass对象对应的fourthItem字段的值ListView 项目已被用户点击,所以我可以将它设置在detailsFragment 中的TextView 中?

在提到的第一个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();
}

【问题讨论】:

    标签: android listview android-fragments android-listview android-arrayadapter


    【解决方案1】:

    您可以通过使用getListAdapter调用Adapter的getItem方法从ListView获取选定的行项目对象:

    @Override
    public void onListItemClick(ListView l, View v, int position, long id) {
       MyClass class = (MyClass)getListAdapter().getItem(position);
    }
    

    【讨论】:

      【解决方案2】:

      通过使用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();
      }
      

      【讨论】:

        【解决方案3】:

        像这样改变你的方法

        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 并简单地显示它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-21
          • 1970-01-01
          • 1970-01-01
          • 2012-03-06
          • 1970-01-01
          相关资源
          最近更新 更多