视图适配器的无条件布局膨胀警告

3
我在我的提示对话框中使用GridView,以下是我的代码。出现了标题中的错误。我的代码和更多所需信息如下。
  private void showGotoPageDialog() {

        final Dialog mDialog = new Dialog(getActivity());
        mDialog.setContentView(R.layout.grid_dialogue);
        mDialog.getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT);
        GridView mGridView = (GridView) mDialog.findViewById(R.id.grid_dialog);
        ArrayList<String> tmp = new ArrayList<>(mPageOptions.length);
        for(int i = 0; i < mPageOptions.length; i++)
        {
            tmp.add(mPageOptions[i].split(" ")[1]);
        }
        CustomAdapter adapter = new CustomAdapter(getActivity(), tmp, mPageIndx);
        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, tmp);
        mGridView.setAdapter(adapter);
        mGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int item, long l) {
                mDialog.dismiss();
                mPageIndx = item + 1;
                updateQuotesListServer();
                updatePageInfo();
            }
        });
        mDialog.show();
        TextView dismiss = (TextView) mDialog.findViewById(R.id.dialog_dismiss);
        dismiss.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mDialog.dismiss();
            }
        });
    }

像这样的适配器
 private class CustomAdapter extends BaseAdapter
    {
        private ArrayList<String> list;
        private LayoutInflater inflater;
        private int currentPage;

        CustomAdapter(Activity activity, ArrayList<String> list, int currentPage)
        {
            this.list = new ArrayList<>();
            this.list.addAll(list);
            inflater = (LayoutInflater) activity.getSystemService(AppCompatActivity.LAYOUT_INFLATER_SERVICE);
            this.currentPage = currentPage;
        }

        public void setCurrentPage(int currentPage)
        {
            this.currentPage = currentPage;
        }

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

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

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

        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            view = View.inflate(getActivity(),R.layout.dialogue_item, null);
            TextView txt = (TextView) view.findViewById(R.id.textview_dialogue);
            txt.setText(list.get(i));
            if(i == currentPage-1)
            {
                txt.setTextColor(Color.BLACK);
            }

            return view;
        }
    }

这一行代码给我发出了警告

view = View.inflate(getActivity(),R.layout.dialogue_item, null);

警告如下:

Unconditional layout inflation from view adapter: Should use View Holder pattern (use recycled view passed into this method as the second parameter) for smoother scrolling.

我的代码按照预期正常工作,没有遇到任何问题。我想知道需要进行哪些更改以修复此问题以及它的好处是什么?如果有人能帮助我解决这个疑问并摆脱困境,请告诉我。

谢谢

4个回答

10

视图适配器是这样构建的,以便于不必为每个项目创建一个新视图,滚动屏幕时可以重复使用已经存在的视图(它们通过getView方法的第二个参数传递进来)。您被告知应该尝试重用这些视图,而不是总是充气新的视图。请将这一行改为:

if (view == null) view = View.inflate(getActivity(),R.layout.dialogue_item, null);

如果我这样使用,警告就会消失,但是会出现以下错误:ava.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)',在这一行代码上:TextView txt = (TextView) view.findViewById(R.id.textview_dialogue); - Priya
1
@ Priya 之前有一个打字错误。请再试一次。 - Leo Aso
它正常工作了...非常感谢您解决我的问题 :) - Priya

0

0

试试这个替代方案

view = View.inflate(R.layout.dialogue_item, viewGroup, null);

0

感谢提供有用的答案:我遇到了相同的错误,但我正在使用视图绑定。通过使用this方法解决了问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接