0

我想问一下如何从Listview BaseAdapter导航到Fragment?我单击任何项​​目并从中获取位置和信息并发送到 Fragment。我该怎么做?

我的基本适配器:

public class ListViewAdapter extends BaseAdapter {

// Declare Variables
Context context;
LayoutInflater inflater;
ArrayList<HashMap<String, String>> data;
ImageLoader imageLoader;
HashMap<String, String> resultp = new HashMap<String, String>();

public ListViewAdapter(Context context,
        ArrayList<HashMap<String, String>> arraylist) {
    this.context = context;
    data = arraylist;
    imageLoader = new ImageLoader(context);
}

@Override
public int getCount() {
    return data.size();
}

@Override
public Object getItem(int position) {
    return null;
}

@Override
public long getItemId(int position) {
    return 0;
}

public View getView(final int position, View convertView, ViewGroup parent) {
    // Declare Variables
    TextView country, rank;
    // TextView population;
    ImageView flag;

    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    View itemView = inflater.inflate(R.layout.listview_item, parent, false);
    // Get the position
    resultp = data.get(position);

    // Locate the TextViews in listview_item.xml
    rank = (TextView) itemView.findViewById(R.id.rank);
    country = (TextView) itemView.findViewById(R.id.country);
    // Locate the ImageView in listview_item.xml
    flag = (ImageView) itemView.findViewById(R.id.flag);

    // Capture position and set results to the TextViews
    distance.setText(resultp.get(FragmentPlaces.RANK));
    bar_name.setText(resultp.get(FragmentPlaces.COUNTRY));
    // population.setText(resultp.get(MainActivity.POPULATION));
    // Capture position and set results to the ImageView
    // Passes flag images URL into ImageLoader.class
    imageLoader.DisplayImage(resultp.get(FragmentPlaces.FLAG), logo_image);
    // Capture ListView item click
    itemView.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View arg0) {
            // // Get the position
            resultp = data.get(position);

            Bundle bundle = new Bundle();
            bundle.putString("rank", resultp.get(FragmentPlaces.RANK));
            bundle.putString("country",
                    resultp.get(FragmentPlaces.COUNTRY));
            bundle.putString("flag", resultp.get(FragmentPlaces.FLAG));
            // set Fragmentclass Arguments
            FragmentSubVenues fragSubVenues = new FragmentSubVenues();
            fragSubVenues.setArguments(bundle);
            // FragmentTransaction ft =
            // getFragmentManager().beginTransaction();
            // ft.replace(R.id.activity_main_content_fragment,
            // fragSubVenues);
            // ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            // ft.addToBackStack(null);
            // ft.commit();
            // FragmentManager fragmentManager =
            // activity.getFragmentManager();

        }
    });
    return itemView;
}
}

我想在 Fragment 下方导航:

  public FragmentSubVenues() {
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_subview, null);
    Bundle bundle = this.getArguments();
    if(bundle != null){
        bar_name = bundle.getString("country");
        bar_name = bundle.getString("rank");
        bar_name = bundle.getString("flag");
    }

    TextView txtrank = (TextView) view.findViewById(R.id.rank);
    TextView txtcountry = (TextView) view.findViewById(R.id.country);
    ImageView imgflag = (ImageView) view.findViewById(R.id.flag);
    txtrank.setText(country);
    txtcountry.setText(rank);
    imageLoader.DisplayImage(flag, imgflag);

    return view;
}

}

4

1 回答 1

1

您可以在适配器中定义一个接口(监听器)并在您的活动或片段中实现监听器。

请注意,您可以直接为列表视图设置一个 OnItemSelectedListener,而不是为每个列表项设置一个 onClickListener。(也请参阅底部的 NB 注释)

无论如何,如果您打算以当前的方式进行操作,这里有一些基于您当前代码的示例代码:

public class ListViewAdapter extends BaseAdapter {

public interface OnItemSelectedListener {
    public void onSelected(String country, String rank, String flag);
}
private OnItemSelectedListener mListener;
// Declare Variables
Context context;
LayoutInflater inflater;
...

并且需要在适配器类中提供设置监听器的方法,也就是简单地将监听器实现分配给mListener:

public void setOnSelectedListener(OnItemSelectedListener l) {
    mListener = l;
}

在您尝试启动片段的原始代码中,调用侦听器的方法:

public View getView(final int position, View convertView, ViewGroup parent) {
....
itemView.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View arg0) {
       if(mListener!=null) {
           resultp = data.get(position);
           mListener.onSelected(resultp.get(FragmentPlaces.COUNTRY),
               resultp.get(FragmentPlaces.RANK), 
               resultp.get(FragmentPlaces.FLAG));
       }
    ....

并将您的片段开始代码移动到您的活动或主要片段中,它实现了定义的接口。

注意:您没有使用传递给适配器的 getView 方法的 convertView,这通常不适合 listview/gridview。你可以在 Google 中搜索 ListView Adapter convertView,你会发现很多介绍它的文章。

注意:您实际上不需要为列表项的每个视图设置 OnClickListener。相反,您可以直接为 ListView 设置 OnItemClickListener,并在那里切换片段。我认为这比您目前所做的要好得多。这将为您节省很多额外的代码。而且您可能不需要定义接口。

编辑:使用 OnItemClickListener 的示例

基本上你可以在 onCreate (如果你在活动中使用它)或 onCreateView (如果你在另一个片段中使用它)设置监听器如下

...
mAdapter = new ListViewAdapter(...);
ListView yourListView = (ListView)findViewById(R.id.your_list_view_id);
yourListView.setAdapter(mAdapter);
yourListView.setOnItemClickListener( new OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
        HashMap<String, String> resultp = mAdapter.getItem(position);
        // Switch to the fragment you want with the information you can get from resultp
        ...
    }
});

switchFragment 是你开始新片段的方法,你可以写那个方法

于 2014-11-13T07:08:00.457 回答