2017-02-14 7 views
0

ListViewCheckBoxとしたが、スクロールリストビューでは無秩序に選択している。私を助けてください。事前のおかげで私はチェックボックスでリストビューを作ったが、リストビューをスクロールすると多くのチェックボックスが無作為に選択され、その位置は保持されない

public override View GetView(int position, View convertView, ViewGroup parent) { 
    View view = convertView; 
    if (view == null) { 
     view = context.LayoutInflater.Inflate(Resource.Layout.row1, parent, false); 
    } 
    Data item = this[position]; 
    view.FindViewById<TextView>(Resource.Id.title).Text = item.nameview; 
    view.FindViewById<TextView>(Resource.Id.reporter).Text = item.EmailIdview; 
    checkbox = view.FindViewById<CheckBox>(Resource.Id.checkbox);   
    checkbox.Tag = item.nameview; 
    checkbox.SetOnCheckedChangeListener(new CheckedChangeListener(context, list, position)); 
    return view; 
} 

public class CheckedChangeListener : Java.Lang.Object, CompoundButton.IOnCheckedChangeListener { 

    private Activity context; 
    private List<Data> list; 
    private int mPosition; 

    public CheckedChangeListener(Activity context, List<Data> list, int mPosition) { 
     this.context = context; 
     this.list = list; 
     this.mPosition = mPosition; 
    } 

    public void OnCheckedChanged(CompoundButton buttonView, bool isChecked) { 
     Group gr = new Group();     
     string name = buttonView.Tag.ToString(); 
     if (isChecked) { 
      gr.checkboxSelected(name, isChecked);//list.ElementAt(mPosition)      
     } else {     
      gr.setPosition(mPosition);      
     } 
    }   
} 
+0

持ち主クラス – user3040153

答えて

0

モデルクラスを使用すると、チェックボックスのチェック状態を保持できます。私が見ることができるようにyoがデータと呼ばれるモデルクラスを持っているあなたは、このようなデータモデルクラスににisCheckedを追加することができます

public class Data { 

    String name; 
    boolean isChecked; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 


    public boolean isChecked() { 
     return isChecked; 
    } 

    public void setChecked(boolean checked) { 
     isChecked = checked; 
    } 
} 

今、あなたは、アダプタクラスのいくつかの並べ替えがあります使用ビューホルダーをパターン

チェックボックスのタグを設定できます。 私はあなたが望む結果を得る同じこれに従うための参照例を与えることができます。

import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.TextView; 

import java.util.List; 

public class DataAdapter extends BaseAdapter { 


    public Activity context; 

    public List<Data> list; 

    public DataAdapter(Activity context, List<Data> list) { 
     this.context = context; 
     this.list = list; 
    } 

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

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

    @Override 
    public long getItemId(int i) { 
     return list.size(); 
    } 

    @Override 
    public View getView(int position, View view, ViewGroup viewGroup) { 
     Holder holder; 
     if (view == null) { 
      LayoutInflater inflater = context.getLayoutInflater(); 
      view = inflater.inflate(R.layout.list_row, viewGroup, false); 
      holder = new Holder(); 
      holder.textView = (TextView) view.findViewById(R.id.textView); 
      holder.checkBox = (CheckBox) view.findViewById(R.id.checkbox); 

      view.setTag(holder); 
     } else { 
      holder = (Holder) view.getTag(); 
     } 
     holder.checkBox.setOnCheckedChangeListener(new CheckedChangeListener()); 
     holder.checkBox.setTag(position);//important line 
     holder.textView.setText(list.get(position).getName()); 
     holder.checkBox.setChecked(list.get(position).isChecked()); 
     return view; 
    } 

    private class CheckedChangeListener implements CompoundButton.OnCheckedChangeListener { 

     public CheckedChangeListener() { 
     } 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean b) { 
      int position=(int) compoundButton.getTag();//important line 
      list.get(position).setChecked(b);//important line 
     } 
    } 

    public static class Holder { 
     TextView textView; 
     CheckBox checkBox; 
    } 
} 

ので、リストビューのアイテムビューのリユース機構からだ;)

+0

ありがとうございました。 – priyanka

0

オーバーライドあなたのアダプタの内部この二つの方法:これはあなたの問題を解決します

@Override 
    public int getViewTypeCount() { 

     return getCount(); 
    } 

    @Override 
    public int getItemViewType(int position) { 

     return position; 
    } 

希望。

乾杯!

0

この問題の理由の

アダプターは、リストに表示されているビューの数がわかりません。そのためには、アダプタにこれら2つの機能を含めることができます。

@Override public int getViewTypeCount() { return 1; } 

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

他の理由は、リストの中で何かを更新していますが、それはあなたのリストビューを離れてからスクロールの項目についての情報を失うことになるスクロールfrom.Onフェッチデータベース(モデル)でそれを更新していないことをすることができあなたが提供したデータベースからそれらを再び読み込みます。そのデータベースには情報が更新されているはずです。詳細については、このリンクをチェックしてください。

アダプターのすべてのifにelseを使用しない:アダプターで使用する条件によって、アダプターが何をすべきかを認識できるように、常にelseを指定します。アダプター項目の混乱の原因となることがあります。

ビューホルダーパターンを使用していません:この問題の原因はよく知られています。ビューホルダーパターンを使用して、アダプターがレイアウトを何度も繰り返し描画しないようにする必要があります。

0

コーディングハッピー。答えの1つのようにDataのソースコードを変更するか、Listフィールドをアダプタに追加して、各アイテムのチェック状態を保存し、相対アイテムが表示されたときに復元することができます。

関連する問題