我有一个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
)。有没有办法实现这个目标?
答案 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)
也许您可以使用新布局设置新适配器