2017-09-02 35 views
0

我有一个显示TextView和Button的listView。点击按钮后,我想将布局更改为完全不同的布局。这是我在相同的尝试,但它并没有表现出任何的变化(适配器类):如何用另一个单击按钮替换listView元素的布局?

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)中再次添加相同的事物,从而实现其可见性(gonevisible)。有什么办法可以做到这一点?

+0

使用片段的新的适配器,按钮点击与第一个 – Salman500

回答

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; 
    } 
} 
+0

有被更换片段可能是你的答案中有一个错字 - 你肯定不会建议我两次重写相同的方法。你可能会添加几行代码来解释? –

+0

@MJLearner谢谢,修正了它 – algrid

+0

@MJLearner增加了示例代码 – algrid

0

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

这里的片段不会起作用,因为隐藏的第一个视图一旦点击按钮就没有用,因此不需要是并发的子活动。

0

也许你可以设置的新布局

相关问题