【问题标题】:ListView in Fragment does not work片段中的 ListView 不起作用
【发布时间】:2017-08-04 13:53:21
【问题描述】:

我的MainActivity 是一个带有两个选项卡的TabbedActivity,每个选项卡由一个单独的Fragment 表示。第二个选项卡应显示ListView。在我的 MainActivity 中,我使用这个 Adapter 来应用我的片段:

public class SectionsPagerAdapter extends FragmentPagerAdapter {
    public SectionsPagerAdapter(FragmentManager fm) {
        super (fm);
    }
    @Override
    public Fragment getItem(int position) {
        Fragment fragment =null;
        switch (position) {
            case 0:
                fragment = Fragment.instantiate(MainActivity.this, Fragment2.class.getName());
                break;
            case 1:
                fragment = Fragment.instantiate(MainActivity.this, Fragment2.class.getName());
                break;
        }
        return fragment;
    }

    public int getCount() {
        return 2;
    }

    @Override
    public CharSequence getPageTitle(int position) {
        switch (position) {
            case 0:
                return "Tab1";
            case 1:
                return "Tab2";
        }
        return null;
    }
}

这是Fragment2 class

public class Fragment2 extends Fragment {
protected List<Transaction> myTransactions = new ArrayList<Transaction>();
private Context mContext;
DatabaseHelper DBH = new DatabaseHelper(mContext);
String DepositInputValue, DepositInputDate, DepositInputNote;

private static final String ARG_SECTION_NUMBER = "section_number";

public AssetsOverviewList() {
}

public static Fragment2 newInstance(int sectionNumber) {
    Fragment2 fragment = new Fragment2();
    Bundle args = new Bundle();
    args.putInt(ARG_SECTION_NUMBER, sectionNumber);
    fragment.setArguments(args);
    return fragment;
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View rootView = inflater.inflate(R.layout.fragment_2, container, false);
    return rootView;
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    Cursor res = DBH.getAllData();
    if (res.getCount() == 0) {
        //do something
        return;
    }
    StringBuffer buffer = new StringBuffer();
    while (res.moveToNext()) {
        buffer.append("Value :" + res.getString(1) + "\n");
        buffer.append("Date  :" + res.getString(2) + "\n");
        buffer.append("Note  :" + res.getString(3) + "\n\n");
    }
    // Show all data
    showMessage("Data", buffer.toString());

    while (res.moveToNext()) {


        DepositInputValue = res.getString(1);
        DepositInputDate = res.getString(2);
        DepositInputNote = res.getString(3);
    }
}

private class LastTransactionsListAdapter extends ArrayAdapter<Transaction> {
    public LastTransactionsListAdapter() {
        super(MainActivity.this, R.layout.transaction_list_view, myTransactions);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View itemView = convertView;
        if (itemView == null) {
            itemView = getLayoutInflater().inflate(R.layout.transaction_list_view, parent, false);
        }
        Transaction currentTransaction = myTransactions.get(position);
        return itemView;
    }
}
private void populateListView() {
    ArrayAdapter<Transaction> adapter = new LastTransactionsListAdapter();
    ListView list = (ListView) list.findViewById(last_transactions_listView);
    list.setAdapter(adapter);
}
}

我在LastTransactionsListAdapter 之后的super 处收到错误消息,其中显示“MainActivity 不是封闭类”。它下面的六行告诉我不能应用getLayoutInflater。如果我删除所有与ListView 相关的东西,该应用程序就可以正常工作。我该如何解决?

【问题讨论】:

  • 你的代码没有意义。 ArrayAdapter 应该描述单行,但您正试图在内部处理整个 ListViewListView它的多行列表,像这样link
  • @grabarz121 我会尽快看看

标签: android listview android-fragments


【解决方案1】:

这可能是因为你的线路 -

super(MainActivity.this, R.layout.transaction_list_view, myTransactions);

在这里获取上下文,您已经完成 MainActivity.this 但这不是您的 MainActivity 类,而是您的 Fragment 类。

要获取片段中的上下文,您可以使用getActivity() 方法调用其调用活动类。所以把它改成 -

super(getActivity(), R.layout.transaction_list_view, myTransactions);

您的getLayoutInflater() 电话也是如此。此方法仅适用于活动而不是片段,因此您也需要做同样的事情。使用getActivity().getLayoutInflater()调用它

所以你的 Line 变成了 -

itemView = getActivity().getLayoutInflater().inflate(R.layout.transaction_list_view, parent, false);

【讨论】:

  • 谢谢。我对 android / java 编程有点陌生,所以我不知道...
【解决方案2】:

尝试使用下面的适配器

private class LastTransactionsListAdapter extends ArrayAdapter<Transaction> {
        public LastTransactionsListAdapter() {
            super(getActivity(), R.layout.transaction_list_view, myTransactions);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View itemView = convertView;
            if (itemView == null) {
                itemView = getActivity().getLayoutInflater().inflate(R.layout.transaction_list_view, parent, false);
            }
            Transaction currentTransaction = myTransactions.get(position);
            return itemView;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-20
    • 2020-01-14
    • 1970-01-01
    相关资源
    最近更新 更多