在Android中创建分层列表文件

时间:2011-12-07 14:22:15

标签: android hierarchical-data

我正在构建一个论坛-theh应用程序,并且需要以分层方式显示forumposts,以便人们可以轻松地看到哪些帖子正在响应(孩子们)哪个。每个forumpost都有自己的对象,该对象包含一个(int)深度变量,用于定义与其父对象相关的位置。

我有一个BroadcastReciever,它接收数据并根据数据设置listadapter。 我的计划现在是使用getListAdapter()。getChildAt(position).setLeft(pixels);每个条目的方法,但我在setLeft方法得到nullpointerexception。我的代码是:

            @Override
        public void onReceive(Context context, Intent intent) {
            String jsonEmner = intent
                    .getStringExtra(RestService.PARAM_OUT_MSG);
            emner = gson.fromJson(jsonEmner, EmneItem[].class);
            Log.e(this.getClass().getSimpleName(), jsonEmner);
            populateEmner();

            int firstID = getListView().getFirstVisiblePosition();
            int listSize = getListView().getCount();

            for (int count = firstID; count < listSize; count++) {
                EmneItem e = (EmneItem) getListView().getItemAtPosition(count);
                getListView().getChildAt(count).setLeft(e.getDepth());
            }
        }

此代码位于ListFragment类中的BroadCastReciever方法内。我希望有人能指出我正确的方向如何做到这一点:)

1 个答案:

答案 0 :(得分:1)

我觉得有点愚蠢回答我自己的问题,但我找到了一个解决方法,以防任何人遇到类似的情况。

我创建了自己的自定义ArrayAdapter,以及一个定义行布局的XML文件。 ArrayAdapter有一个getView()方法,允许你自定义每个条目,并根据我的条目“深度”变量,我设置textviews LayoutParams。

如果有人想看看它是如何完成的:

    class CustomAdapter extends ArrayAdapter<EmneItem> {
        CustomAdapter() {
            super(getActivity(), R.layout.row, emner);
        }

        public View getView(int position, View convertView, ViewGroup parent) {
            View row = convertView;

            //Reusing convertView if possible, if not then inflating a new
            if(row == null) {
                LayoutInflater inflater = getActivity().getLayoutInflater();
                row = inflater.inflate(R.layout.row, parent, false);
            }

            TextView postedby = (TextView) row.findViewById(R.id.postedbytextview);
            postedby.setText("Posted by: " + emner[position].getPosted_by());

            TextView argument = (TextView) row.findViewById(R.id.argumentTextView);
            argument.setText(emner[position].getArgument());

            TextView procontratextview = (TextView) row.findViewById(R.id.procontratextview);
            int procontra = emner[position].getProcontra();
            if (procontra == EmneItem.PRO) {
                procontratextview.setText("PRO");
            }
            if (procontra == EmneItem.CONTRA) {
                procontratextview.setText("CONTRA");
            }

            LinearLayout.LayoutParams llp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);

            if(emner[position].getDepth() == 1) {
                llp.setMargins(10, 0, 0, 0);
                  procontratextview.setLayoutParams(llp);
                  argument.setLayoutParams(llp);
            } else if (emner[position].getDepth() == 2) {
                  llp.setMargins(20, 0, 0, 0);
                  procontratextview.setLayoutParams(llp);
                  argument.setLayoutParams(llp);
            } else if (emner[position].getDepth() == 3) {
                llp.setMargins(30, 0, 0, 0);
                  procontratextview.setLayoutParams(llp);
                  argument.setLayoutParams(llp);
            } else if (emner[position].getDepth() >= 4) {
                llp.setMargins(40, 0, 0, 0);
                  procontratextview.setLayoutParams(llp);
                  argument.setLayoutParams(llp);
            }
            return (row);
        }
    }

这主要基于我在http://commonsware.com/Android/excerpt.pdf

找到的文章

干杯