2017-09-02 4 views
0

私は、TextViewとボタンを表示する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

利用フラグメントで新しいアダプタを設定することができますが、ボタンの上に最初の1 – Salman500

答えて

1

これを行うには、getItemViewType()getViewTypeCount()を上書きできます。あなたの別のビューレイアウトは別のビュータイプとして表されます。クリックが発生したら、セルのビュータイプの別の値を返すようにアダプタデータを変更する必要があります。 ListViewをリロードするには、notifyDataSetChanged()を呼び出します。ここで

は原則として説明するための非常に基本的なサンプルコードです:

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

で断片を置換]をクリックありおそらくあなたの答えのタイプミスです - あなたは確かに同じ方法を2回上書きするように私に示唆していませんでした。あなたはおそらく説明するために数行のコードを追加できますか? –

+0

@MJLearnerありがとう、それを修正しました – algrid

+0

@MJLearnerはサンプルコードを追加しました – algrid

0

あなたがしたいことをする唯一の方法は、レイアウトブロックを複製して可視性を切り替えることです。

ボタンをクリックすると隠されている最初のビューは使用できなくなるため、ここではフラグメントは再生されません。そのため、サブアクティビティは同時に発生する必要はありません。

0

たぶん、あなたは新しいレイアウト

関連する問題