如何在单击按钮时将listView元素的布局替换为另一个?

时间:2017-09-02 17:32:07

标签: android android-layout listview

我有一个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];
    }
}

新的Layout中有多个元素,我也在其他地方使用它,所以我想重新使用那个布局,而不是在这个布局(list_element_main)中再次添加相同的东西来玩它的可见性({{ 1}}和gone)。有没有办法实现这个目标?

3 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

也许您可以使用新布局设置新适配器