【问题标题】:Assigning unique tag to list item in a list将唯一标签分配给列表中的列表项
【发布时间】:2014-09-10 16:11:27
【问题描述】:

我需要帮助我在 viewHolder 对象中设置标签。我有一个比屏幕长的列表(在手机上),我需要为每个视图设置不同的标签。正如您在我的预览应用程序(下面的链接)中看到的,在外部片段中,第一项和最后一项绑定在一起。我不希望那样,我希望每个观点都是独一无二的。我该怎么做。

https://drive.google.com/file/d/0B2xlu23GjnfvTEgtbkprOThtMmM/edit?usp=sharing

谢谢

我的检查列表适配器

public class InspectionListAdapter extends ArrayAdapter<String> {

private final Activity context;
private final String[] inspectionTitles;
private final String[] description;

public InspectionListAdapter(Activity context, String[] inspectionTitles,
        String[] description) {
    super(context, R.layout.inspection_item_layout, inspectionTitles);
    this.context = context;
    this.inspectionTitles = inspectionTitles;
    this.description = description;
}

public static class ViewHolder {
    public ImageView imageView, expandButton;
    public TextView txtTitle;
    public TextView txtDescription;
    public RelativeLayout expandLayout;
    public EditText ownDesc, estCost;
    public LayerDrawable listItem;
    public GradientDrawable color;
    public CheckBox checkRepair, checkDone;
    public RelativeLayout mainLayout;

}

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

    final ViewHolder viewHolder;

    View rowView = view;

    if (rowView == null) {
        LayoutInflater inflater = context.getLayoutInflater();
        rowView = inflater.inflate(R.layout.inspection_item_layout, null,
                true);

        viewHolder = new ViewHolder();



        viewHolder.mainLayout = (RelativeLayout) rowView
                .findViewById(R.id.item_layout_main);

        viewHolder.txtTitle = (TextView) rowView
                .findViewById(R.id.textViewItemTitle);

        viewHolder.txtDescription = (TextView) rowView
                .findViewById(R.id.textViewTip);

        viewHolder.listItem = (LayerDrawable) rowView.getResources()
                .getDrawable(R.drawable.layer_car_background);

        viewHolder.color = (GradientDrawable) (viewHolder.listItem
                .findDrawableByLayerId(R.id.item_list_background));

        viewHolder.imageView = (ImageView) rowView
                .findViewById(R.id.imageViewItem);

        viewHolder.expandButton = (ImageView) rowView
                .findViewById(R.id.imageViewTitle);

        viewHolder.ownDesc = (EditText) rowView
                .findViewById(R.id.editTextDescription);

        viewHolder.estCost = (EditText) rowView
                .findViewById(R.id.editTextEstCost);

        viewHolder.checkRepair = (CheckBox) rowView
                .findViewById(R.id.checkBox2);

        viewHolder.checkDone = (CheckBox) rowView
                .findViewById(R.id.checkBox1);

        viewHolder.checkRepair
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton view,
                            boolean arg1) {
                        // TODO Auto-generated method stub

                        if (view.isChecked()) {
                            viewHolder.checkDone.setChecked(false);
                        }
                    }
                });
        viewHolder.checkDone
                .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                    @Override
                    public void onCheckedChanged(CompoundButton view,
                            boolean arg1) {
                        // TODO Auto-generated method stub

                        if (view.isChecked()) {
                            viewHolder.checkRepair.setChecked(false);

                        }
                    }
                });

        viewHolder.expandLayout = (RelativeLayout) rowView
                .findViewById(R.id.relativeLayoutExpandable);

        viewHolder.expandLayout.setVisibility(View.GONE);

        viewHolder.expandButton
                .setOnClickListener(new OnClickListener() {

                    public void onClick(View v) {
                        // TODO Auto-generated method stub

                        if (viewHolder.expandLayout.getVisibility() == View.VISIBLE) {
                            viewHolder.expandButton
                                    .setImageResource(R.drawable.ic_action_expand);
                            viewHolder.expandLayout
                                    .setVisibility(View.GONE);
                            if (viewHolder.checkDone.isChecked()) {

                                viewHolder.mainLayout
                                        .setBackgroundResource(R.drawable.layer_car_background_green);

                            }
                            if (viewHolder.checkRepair.isChecked()) {

                                viewHolder.mainLayout
                                        .setBackgroundResource(R.drawable.layer_car_background_red);
                            }

                        } else {
                            viewHolder.expandButton
                                    .setImageResource(R.drawable.ic_action_collapse);
                            viewHolder.expandLayout
                                    .setVisibility(View.VISIBLE);

                            viewHolder.mainLayout
                                    .setBackgroundResource(R.drawable.layer_car_background);

                        }
                    }
                });


        rowView.setTag(viewHolder);

    } else {

        viewHolder = (ViewHolder) rowView.getTag();
    }


    viewHolder.txtTitle.setText(inspectionTitles[position]);
    viewHolder.txtDescription.setText("Tip: \n" + description[position]);
    viewHolder.imageView.setImageResource(R.drawable.ic_launcher);
    viewHolder.expandButton
            .setImageResource(R.drawable.ic_action_expand);

    return rowView;
}

}

【问题讨论】:

  • 我建议您了解 getView 的工作原理。视图将被回收。而且您不应该让“每个视图都独一无二”
  • 我的列表不是动态列表,它是由我的 string.xml 文件中的字符串数组生成的预设列表。我希望我所有的观点都保留他们的 onClickListeners 和 onCheckChangedListeners
  • 请说明您尝试在哪里为每个视图设置不同的标签。我看到的是您将视图持有者设置为视图的标签。它们在哪些方面不同? “保留点击听众等”与这一切有什么关系?当然,还有更多的项目可以放在屏幕上。而且您的 google 文档在我的平板电脑上无法读取,所以我不知道那里出了什么问题。
  • 这是一个 .apk,您应该能够安装它并查看我的问题所在。当您转到第二个片段时(此列表比其他列表长)。如果单击第一项的展开按钮,列表中的最后一项也会展开,如果您选中两个复选框中的任何一个,列表中最后一项的颜色也会改变...
  • 不明白你对第二个片段的意思。当我单击圆圈中的 + 时,我只会得到一个列表。如果我然后扩大地下室湿度,其他人不会扩大。另外,当我检查某些东西时,只有它的父级是彩色的。未展开的列表不会填满屏幕。在两台设备上测试。

标签: android android-listview listadapter


【解决方案1】:

错误在于viewHolder.expandbutton的OnClickListener的onClick。在那里,您立即从“if (viewHolder ...)”开始。但这是错误的 viewHolder,因为在用户单击视图的那一刻,许多 viewHolder 可能已经创建并死亡。所以你必须首先获得正确的viewHolder。类似(未经测试)

                View rowView = (View)v.getParent();

                ViewHolder viewHolder =(ViewHolder) rowView.getTag();

你把它放在 onClick() 方法中。 final ViewHolder viewHolder; 你为了在 onClick() 和 onCheckedChanged 中使用它做了最终的。删除决赛。不幸的是 getParent() 在 onCheckedChanged 中不起作用。所以我们做的不同。

    viewHolder.checkDone.setTag(viewHolder.checkRepair);
    viewHolder.checkDone
            .setOnCheckedChangeListener(new OnCheckedChangeListener() {

                @Override
                public void onCheckedChanged(CompoundButton view,
                        boolean arg1) {

                    CheckBox checkBox = (CheckBox)view.getTag();

                    if (view.isChecked()) {
                        //viewHolder.checkRepair.setChecked(false);
                        checkBox.setChecked(false);
                    }
                }
            });

对另一个复选框执行相同操作。

现在颜色扩展到另一个视图。原因是你应该在设置新的txtTitle、txtDescription等的同时设置默认颜色。所以加上viewHolder.mainLayout.setBackgroundResource(R.drawable.layer_car_background);

对于其余部分,您的代码会丢失保持状态。如果一个项目被展开并且用户向上和向下滚动列表(我添加了更多项目以便能够滚动更多),那么展开状态就会消失。此外,复选框不会保持选中状态并且颜色消失(添加更多项目以查看)。您应该添加一些保持状态的布尔数组(至少三个)。更新事件中的那些数组。在 getView() 中读取数组并相应地检查颜色和复选框。添加您将看到的那些数组并不需要太多工作......

【讨论】:

  • 干得好!多谢 !现在我会用状态来敲我的头!
猜你喜欢
  • 1970-01-01
  • 2019-01-14
  • 2017-10-29
  • 1970-01-01
  • 2017-08-25
  • 2012-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多