【问题标题】:How to replace the layout of a listView element with another on clicking a button?如何在单击按钮时将 listView 元素的布局替换为另一个?
【发布时间】:2017-09-02 17:32:06
【问题描述】:

我有一个 listView,它显示一个 TextView 和一个 Button。单击按钮时,我想将布局更改为完全不同的布局。这是我的尝试,但没有显示任何更改(适配器类):

public class ListViewAdapter extends ArrayAdapter<String> {

    ArrayList<String> list;

    public ListViewAdapter(@NonNull Context context, @LayoutRes int resource, @NonNull ArrayList<String> objects) {
        super(context, resource, objects);
        this.list = objects;
    }

    @NonNull
    @Override
    public View getView(int position, @Nullable View convertView, @NonNull final ViewGroup parent) {
        final View[] listItemView = {convertView};
        if(listItemView[0] == null) {
            listItemView[0] = 
LayoutInflater.from(getContext()).inflate(R.layout.list_element_main, parent, false);
    }

        TextView textView = (TextView) listItemView[0].findViewById(R.id.main_text_view);
        textView.setText(list.get(position));

        Button button = (Button) listItemView[0].findViewById(R.id.switch_layout_button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                //switch layout:
                //replace R.layout.list_element_main with
                //R.layout_list_element_switch)
                listItemView[0] = LayoutInflater.from(getContext()).inflate(R.layout.list_element_switch, parent, false);
                ListViewAdapter.this.notifyDataSetChanged();
            }
        });

        return listItemView[0];
    }
}

新布局中有多个元素,我也在其他地方使用它,所以我想重新使用那个布局,而不是在这个布局中再次添加相同的东西 (list_element_main) 玩弄它的可见性 (@987654322 @ 和 visible)。有什么方法可以实现吗?

【问题讨论】:

  • 使用片段,点击按钮将片段替换为第一个

标签: android android-layout listview


【解决方案1】:

为此,您可以覆盖getItemViewType()getViewTypeCount()。您的另一个视图布局将表示为另一种视图类型。单击发生时,您应该更改适配器数据,以使其返回单元格视图类型的另一个值。然后调用notifyDataSetChanged()重新加载ListView。

这里有一个非常基本的示例代码来说明原理:

public class SampleAdapter extends BaseAdapter {

    int[] viewTypes = new int[20];

    @Override
    public int getCount() {
        return 10;
    }

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

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

    @Override
    public int getViewTypeCount() {
        return 2;
    }

    @Override
    public int getItemViewType(int position) {
        return viewTypes[position];
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup viewGroup) {
        int viewType = getItemViewType(position);
        if (convertView == null) {
            int layoutResId = viewType == 0 ? R.layout.item_layout1 : R.layout.item_layout2;
            convertView = LayoutInflater.from(viewGroup.getContext()).inflate(layoutResId, viewGroup, false);
        }
        if (viewType == 0) {
            // Just a sample, use a view holder in production code
            convertView.findViewById(R.id.btn).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    viewTypes[position] = 1;
                    notifyDataSetChanged();
                }
            });
        }

        return convertView;
    }
}

【讨论】:

  • 您的回答中可能有一个错字 - 您肯定不是建议我两次覆盖相同的方法。能不能加几行代码解释一下?
【解决方案2】:

我认为做你想做的事的唯一方法是(做你不想做的事,双关语)复制布局块并切换可见性。

这里的片段将不起作用,因为一旦单击按钮,隐藏的第一个视图将毫无用处,因此不需要是并发子活动。

【讨论】:

    【解决方案3】:

    也许你可以用新的布局设置一个新的适配器

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-04
      • 2019-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多