【问题标题】:Replace fragment based on position of list item根据列表项的位置替换片段
【发布时间】:2015-06-04 21:36:06
【问题描述】:

我正在为我的片段使用 2 行列表视图。如何根据所选列表视图项的位置执行必要的程序?下面是替换细节片段的代码,但它与位置无关。

  • 如果 mTwoPane 为 true,我希望将详细信息容器替换为片段(使用该列表项中的片段名称)
  • 如果 mTwoPane 为 false,我希望启动活动(使用该列表项中的活动名称)

更换细节容器

                FragmentLineChooserList newFragment = new FragmentLineChooserList();
                FragmentTransaction transaction = FragmentMainList.this.getActivity().getSupportFragmentManager().beginTransaction();
                transaction.replace(R.id.detail_container, newFragment);
                transaction.commit();

FragmentWCLine.java

public class FragmentWCLine extends android.support.v4.app.Fragment {

    ListView listView;

    private class WC {
        private CharSequence station;
        private CharSequence zone;
        private Class<? extends Activity> activityClass;
        private Class<? extends android.support.v4.app.Fragment> fragmentClass;

        public WC(int stationResId, int zoneResId, Class<? extends Activity> activityClass, Class<? extends android.support.v4.app.Fragment> fragmentClass) {
            this.fragmentClass = fragmentClass;
            this.activityClass = activityClass;
            this.station = getResources().getString(stationResId);
            this.zone = getResources().getString(zoneResId);
        }

        @Override
        public String toString() { return station.toString(); }
        public String getzone(){ return zone.toString(); }
    }

    private static WC[] mWC;

    private boolean mTwoPane;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.fragment_wc_line, container, false);

        mWC = new WC[]{
                new WC(R.string.bank, R.string.zone_1, WCBankActivity.class, FragmentWCBank.class),
                new WC(R.string.wat, R.string.zone_1, WCWATActivity.class, FragmentWCWAT.class)
        };

        listView = (ListView)v.findViewById(R.id.list_wc);
        listView.setAdapter(new MyAdapter(getActivity(), mWC));

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (mTwoPane) {
                    startActivity(new Intent(getActivity(), mWC[position].fragmentClass));
                } else {
                    startActivity(new Intent(getActivity(), mWC[position].activityClass));
                }
            }
        });

        return v;
    }

    static class MyAdapter extends BaseAdapter {

        static class ViewHolder {
            TextView station;
            TextView zone;
        }

        LayoutInflater inflater;
        WC[] mWC;

        public MyAdapter(Context contexts, WC[] samples) {
            this.mWC = samples;
            inflater = LayoutInflater.from(contexts);
        }

        @Override
        public int getCount() {
            return mWC.length;
        }

        @Override
        public Object getItem(int position) {
            return mWC[position];
        }

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

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.list_item_dualline, null);
                viewHolder = new ViewHolder();

                viewHolder.station = (TextView) convertView.findViewById(R.id.list_item_station);
                viewHolder.zone = (TextView) convertView.findViewById(R.id.list_item_zone);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.station.setText(mWC[position].station);
            viewHolder.zone.setText(mWC[position].getzone());
            return convertView;
        }
    }
}

FragmentWCLine - 更新 0

public class FragmentWCLine extends android.support.v4.app.Fragment {

    ListView listView;

    private class WC {
        private CharSequence station;
        private CharSequence zone;
        private Class<? extends Activity> activityClass;
        private Class<? extends android.support.v4.app.Fragment> fragmentClass;

        public WC(int stationResId, int zoneResId, Class<? extends Activity> activityClass, Class<? extends android.support.v4.app.Fragment> fragmentClass) {
            this.fragmentClass = fragmentClass;
            this.activityClass = activityClass;
            this.station = getResources().getString(stationResId);
            this.zone = getResources().getString(zoneResId);
        }

        @Override
        public String toString() { return station.toString(); }
        public String getzone(){ return zone.toString(); }
    }

    private static WC[] mWC;

    private boolean mTwoPane;

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
        View v = inflater.inflate(R.layout.fragment_wc_line, container, false);

        mWC = new WC[]{
                new WC(R.string.bank, R.string.zone_1, WCBankActivity.class, FragmentWCBank.class),
                new WC(R.string.wat, R.string.zone_1, WCWATActivity.class, FragmentWCWAT.class)
        };

        listView = (ListView)v.findViewById(R.id.list_wc);
        listView.setAdapter(new MyAdapter(getActivity(), mWC));

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                if (mTwoPane) {
                    startActivity(new Intent(getActivity(), mWC[position].fragmentClass));
                } else {
                    startActivity(new Intent(getActivity(), mWC[position].activityClass));
                }
            }
        });

        return v;
    }

    static class MyAdapter extends BaseAdapter {

        static class ViewHolder {
            TextView station;
            TextView zone;
        }

        LayoutInflater inflater;
        WC[] mWC;

        public MyAdapter(Context contexts, WC[] samples) {
            this.mWC = samples;

        }

        @Override
        public int getCount() {
            return mWC.length;
        }

        @Override
        public Object getItem(int position) {
            return mWC[position];
        }



        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if (convertView == null) {
                convertView = inflater.inflate(R.layout.list_item_dualline, null);
                viewHolder = new ViewHolder();

                viewHolder.station = (TextView) convertView.findViewById(R.id.list_item_station);
                viewHolder.zone = (TextView) convertView.findViewById(R.id.list_item_zone);
                convertView.setTag(viewHolder);
            } else {
                viewHolder = (ViewHolder) convertView.getTag();
            }
            viewHolder.station.setText(mWC[position].station);
            viewHolder.zone.setText(mWC[position].getzone());
            return convertView;
        }
    }
}

FragmentWCLine - 更新 1

public class FragmentWCLine extends android.support.v4.app.Fragment {
ListView listView;

private class WC {
    private CharSequence station;
    private CharSequence zone;
    private Class<? extends Activity> activityClass;
    private Class<? extends android.support.v4.app.Fragment> fragmentClass;

    public WC(int stationResId, int zoneResId, Class<? extends Activity> activityClass, Class<? extends android.support.v4.app.Fragment> fragmentClass) {
        this.fragmentClass = fragmentClass;
        this.activityClass = activityClass;
        this.station = getResources().getString(stationResId);
        this.zone = getResources().getString(zoneResId);

    }

    @Override
    public String toString() { return station.toString(); }
    public String getzone(){ return zone.toString(); }
}

private static WC[] mWC;

private boolean mTwoPane;

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){
    View v = inflater.inflate(R.layout.fragment_wc_line, container, false);

    mWC = new WC[]{
            new WC(R.string.bank, R.string.zone_1, WCBankActivity.class, FragmentWCBank.class),
            new WC(R.string.wat, R.string.zone_1, WCWATActivity.class, FragmentWCWAT.class)
    };

    listView = (ListView)v.findViewById(R.id.list_wc);
    listView.setAdapter(new MyAdapter(getActivity(), mWC));

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (mTwoPane) {
                startActivity(new Intent(getActivity(), mWC[position].fragmentClass));
            } else {
                startActivity(new Intent(getActivity(), mWC[position].activityClass));
            }
        }
    });

    return v;
}

static class MyAdapter extends BaseAdapter {

    static class ViewHolder {
        TextView station;
        TextView zone;
    }

    LayoutInflater inflater;
    WC[] mWC;

    public MyAdapter(Context contexts, WC[] samples) {
        this.mWC = samples;

    }

    @Override
    public int getCount() {
        return mWC.length;
    }

    @Override
    public Object getItem(int position) {
        return mWC[position];
    }

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


    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item_dualline, null);
            viewHolder = new ViewHolder();

            viewHolder.station = (TextView) convertView.findViewById(R.id.list_item_station);
            viewHolder.zone = (TextView) convertView.findViewById(R.id.list_item_zone);
            convertView.setTag(viewHolder);
        } else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.station.setText(mWC[position].station);
        viewHolder.zone.setText(mWC[position].getzone());
        return convertView;
    }
}
}

【问题讨论】:

  • 我不完全理解什么不起作用。它不是在 onItemClick(AdapterView> parent, View view, int position...中取值吗?
  • mWC 被声明为静态有什么原因吗?我猜你只是想让它成为一个单身人士,但还有什么其他原因。

标签: java android xml android-intent android-fragments


【解决方案1】:

我注意到MyAdapter 构造函数中代码inflater = LayoutInflater.from(contexts) 的一个问题。它不应驻留在此方法中。我从未见过任何示例项目在构造函数中执行此操作。原因是如果用户翻转手机或 Android 决定换出您的应用程序以释放内存,则构造函数不会恢复。测试一下。

代码建议,在 getView 中膨胀:

public View getView(int position, View convertView, ViewGroup parent) {
   if (convertView == null) {
      convertView = LayoutInflater.from(contexts).inflate(R.layout.list_item_dualline, null);
...
}

新代码建议:

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

注意事项:

  • 从构造函数中获取contexts 并将其保存到getView()。
  • 我注意到您定义了getItemId() 并在适配器中返回0,而不是像位置这样的实际值或mWC[位置] 的成员变量。如果此方法返回 0 或 null,任何引用它的代码都会与零值混淆。
  • getItemId 的代码是从 ArrayAdapter 中的相同方法复制而来的。

【讨论】:

  • 好的,我刚刚删除了:@Override public long getItemId(int position) {return 0;}inflater = LayoutInflater.from(contexts); 我还需要删除什么并添加到 java 文件中?
  • @MacaronLover,就目前而言,仅此而已。我注意到你有一些编译错误。我们,读者和我,以前不知道这些重要信息。
  • @MacaronLover,我查看了 BaseAdapter 和 getItemId() 的示例代码。由于您正在扩展 BaseAdapter,因此为 getItemId 添加代码似乎更安全。因此,我编辑了我的帖子,在 NEW 字下添加了此方法的示例代码。仅供参考,我通常扩展 ArrayAdapter 因为我认为它更容易。
  • 酷。只剩下2个错误。上面的代码和屏幕截图已更新。但是,对于这种情况,我以前从未使用过 ArrayAdapter。为了同意您对 ArrayAdapter 的困难信念,我需要先查看一些代码,看看它是否真的如此。
  • @MacaronLover,我认为继续使用 BaseAdapter 很好,大多数 SO 开发人员都像我一样选择了 ArrayAdapter。但我看不出有什么问题。当然,您的问题与此无关。
猜你喜欢
  • 1970-01-01
  • 2015-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-27
相关资源
最近更新 更多