如何单击ListView中的动态按钮

时间:2011-09-20 13:25:24

标签: android

我有一个Activity,一个ListView和一个ArrayAdapter 在ArrayAdapter中,有一个TextView(我将其命名为“title”)和使用不同文本动态创建的serval按钮。
我想要做的是当我点击按钮时,我想在按钮上显示文字也是“标题”上的文字。
挑战是当我在适配器中执行button.setOnClickListener时,我不知道如何获得标题。
另一方面,如果我执行list.setOnItemClickListener,单击按钮时它不起作用。此外,因为按钮是动态的,我不知道如何显示它 谢谢!

这是我的getView:

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

            Map<String, String> item = listitem.get(position);

            View view = inflater.inflate(resId, parent, false);

            // get views
            final TextView title = (TextView) view.findViewById(R.id.title);
            TextView type = (TextView) view.findViewById(R.id.type);
            final TextView updateDate = (TextView) view.findViewById(R.id.updateDate);
            TableLayout stLayout = (TableLayout) view
                    .findViewById(R.id.showtimes);
            // fo
            title.setFocusable(false);
            updateDate.setFocusable(false);

            // set views
            String[] array = DatabaseHelper.MOVIE_SHOWTIMES;
            for (int i = 0; i < array.length; i++) {
                String datum = item.get(array[i]);
                if (datum != null) {
                    switch (i) {
                    case 0:
                        title.setText(datum);
                        break;
                    case 1:
                        String types = MovieHelper.convertMovieTypes(datum);
                        type.setText(types);
                        break;
                    case 2:
                        try {
                            Date date = new Date(datum);
                            String formattedDate = DateFormatHelper.format(
                                    date, DateFormatHelper.DATE);
                            updateDate.setText(formattedDate);
                        } catch (ParseException e) {
                            Log.e(TAG, e.toString());
                        }
                        break;
                    case 3:
                        try {
                            JSONArray times = new JSONArray(datum);
                            TableRow tableRow = new TableRow(context);
                            tableRow.setGravity(Gravity.CENTER_HORIZONTAL);
                            int record = 0;
                            for (int x = 0; x < times.length(); x++) {
                                String time = times.getString(x);
                                Date convertedTime = new Date(time);
                                try {
                                    String formattedTime = DateFormatHelper
                                            .format(convertedTime,
                                                    DateFormatHelper.TIME);
                                    Button timeButton = new Button(context);
                                    timeButton.setId(buttonCount);
                                    timeButton.setText(formattedTime);

                                    tableRow.addView(timeButton);
                                    buttonCount++;
                                    record++;

                                    timeButton.setFocusable(false);

                                    timeButton.setOnClickListener(new View.OnClickListener() {

                                        @Override
                                        public void onClick(View v) {
                                            v.getParent();
                                            Toast.makeText(getApplicationContext(),
                                                    ((Button)v).getText(),
                                                    Toast.LENGTH_SHORT).show();
                                        }
                                    });



                                } catch (ParseException e) {
                                    Log.e(TAG, e.toString());
                                }
                                if (record % 3 == 0 && record != 0) {
                                    stLayout.addView(tableRow);
                                    tableRow = new TableRow(context);
                                    tableRow.setGravity(Gravity.CENTER_HORIZONTAL);
                                }
                            }
                            if (record % 3 != 0 && record != 0) {
                                stLayout.addView(tableRow);
                            }
                        } catch (JSONException e) {
                            Log.e(TAG, e.toString());
                        }
                        break;
                    }
                }


            }
            return view;

        }

    }

1 个答案:

答案 0 :(得分:0)

首先,您应该回收列表项(如果convertView为null,则仅为膨胀视图)。

为什么要回收意见:
检查this post。关于这一点,这是一个很棒的blog post 基本上,您不会在大多数时间更改列表项的布局,而只是更改其内容。如果你有一个包含1000个项目的列表,那么在向下滚动时会增加1000 xml布局(当再次向上滚动时会增加1000个)。这真的很贵。如果您回收视图,您将一次性膨胀大约10个视图(可见视图的数量),并在滚动时重复使用它们。由于回收机制是内置功能,因此使用它不会花费太多精力......

如果你在谈论这个按钮:

timeButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        v.getParent();
        Toast.makeText(getApplicationContext(),
            ((Button)v).getText(),
            Toast.LENGTH_SHORT).show();
    }
});

这个标题:

final TextView title = (TextView) view.findViewById(R.id.title);

为什么你不在on click listener中调用title.getText()?