2017-08-04 15 views
0

私はリストビューの行が作成されたときに最初に表示される基本テンプレートである基本行を持っていますが、各行にはリストビューでクリックした行に新しい要素を追加するボタンがありますEditText問題は、私が下にスクロールし、私が物事を追加した行に戻って来るたびに、それは再び作成され、私が加えた要素は消去されるということです。行が表示されるたびに私のアプリケーションでメソッドgetView()が呼び出され、基本行テンプレートがあるR.layout.listview_rowを使ってビューを再度インスタンス化しているため、これが起こっていることが分かります。そこで、行の要素が保存されていることをどうすれば確認できるかを知りたいと思います。プログラムでListViewの行に要素を追加する方法は?

これは私のアダプタです:

public class ListAdapter extends BaseAdapter { 

    private final Activity context; 

    ArrayList<String> mDataSet; 


    public ListAdapter(Activity context, ArrayList<String> mDataSet){ 
     super(); 
     this.context=context; 
     this.mDataSet = mDataSet; 
    } 

    @Override 
    public int getCount() { 
     return mDataSet.size(); 
    } 

    @Override 
    public Object getItem(int i) { 
     return mDataSet.get(i); 
    } 

    @Override 
    public long getItemId(int i) { 
     return mDataSet.get(i).hashCode(); 
    } 

    @NonNull 
    @Override 
    public View getView(final int position, @Nullable final View convertView, @NonNull ViewGroup parent) { 
     LayoutInflater inflater=context.getLayoutInflater(); 
     final View rowView= inflater.inflate(R.layout.listview_row, null,true);; 

     TextView exercise_text = (TextView) rowView.findViewById(R.id.exercise_text); 
     exercise_text.setText(mDataSet.get(position)); 

     Button btnEliminarRow = (Button) rowView.findViewById(R.id.btnEliminarRow); 
     btnEliminarRow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       mDataSet.remove(position); 
       notifyDataSetChanged(); 
      } 
     }); 

     Button btnNuevaRow = (Button) rowView.findViewById(R.id.btnNuevaRow); 
     btnNuevaRow.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       addView(rowView); 
      } 
     }); 

     addView(rowView); 

     return rowView; 
    } 

    // Helpers 

    public void addView(View view) { 
     final LinearLayout ll = (LinearLayout) view.findViewById(R.id.layout_sets); 

     LayoutInflater inflater = (LayoutInflater) view.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     final View v = inflater.inflate(R.layout.exercise_row , null); 
     Button moreOptions = (Button) v.findViewById(R.id.moreOptions); 

     ll.addView(v); 

     moreOptions.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View view) { 
       ll.removeView(v); 
      } 
     }); 
    } 
} 

あなたがgetViewメソッドで見ることができるように私は、メソッドaddViewを呼び出すボタンをクリックするたびに、この方法は、いくつかの新しい要素を含むXMLを膨張リスナーを持っています私が作成した基本行に追加したいものです。私が言った問題は、getView()が呼び出されているたびに、ビューを再読み込みすると、追加した要素がオーバーライドされ、レイアウトが開始状態としてビューを再び膨張させていることです。私はifを使用して試してみましたが、convertviewがnullでないかどうかを確認してからビューを再度膨張させませんでしたが、変換ビューが再利用されているので同じように見えません。 。

答えて

0

データセットに新しい項目を追加し、notifyDataSetChangedでアダプターに通知する必要があります。また、私はビューホルダーパターンを実装します。 mDataSetに要素を追加しaddItem(String item)

Here some examples.

さて、戻ってあなたのコードを、あなたはというメソッドを実装する必要があります。その後、アダプターに通知します。 のような何か:その後

public void addItem(String item) { 
    if (mDataSet == null) mDataSet = new ArrayList<>(); 
    mDataSet.add(item); 
    notifyDataSetChanged(); 
} 

ViewHolder Patternexampleを使用するようにgetView()方法を改善します。

+0

はい私は、新しい行がlistViewに追加されたときにアダプタに通知する必要があることを知っています。このメソッドは新しいアクティビティに実装されています。つまり、既に追加されたリストビューに要素を追加するeditTextに編集テキストをプログラム的に追加するには、addViewメソッドを参照してください。 – ravelinx

+0

これは、同じgetView()内の条件で実装する必要があります。たぶん、それらを隠す/表示すると、そのトリックが実行されます。ビューが複雑すぎる場合は、おそらくリサイクルビューに移行することもできます。 –

+0

要素が何度繰り返されるのか分からないので、それらを隠すのは良い考えだとは思わない。私はすでにリサイクルビューを試みていて、同様の問題がありました。 – ravelinx