0

ユーザーにアイテムのリストが表示されるコードがあります。リスト項目の横にトグル ボタンが配置されます。したがって、ユーザーがトグルをオンに設定すると、アラームがトリガーされます。問題は、リストの最初の項目のトグル ボタンを設定すると、リスト ビューの一番下までスクロールして最初の項目に戻ると消えたりリセットされたりすることです。これを選択したままに設定することに完全に混乱しています。このフォーラムで誰かに助けを求めてください。

私のクラスCSVAdapter。ここに付けています。

public class CSVAdapter extends ArrayAdapter<clock>{
    Context ctx;
    String line;
    int position=-1;
    ViewHolder myviewholder;
    mrvtoparanur mp;
    clock clk;
    HashMap<Integer, Boolean> btnstate=new HashMap<Integer,Boolean>();
    public CSVAdapter(Context context,int textViewResourceId, ArrayAdapter<clock> clk)
    {
        super (context,R.layout.checkbox,textViewResourceId);   
        this.ctx = context;
        loadArrayFromFile();
    }

    static class ViewHolder
    {

        TextView text;
        ToggleButton tb;

    }

    @Override
public View getView(final int pos,View convertView,final ViewGroup parent){
         View row=convertView;

        if(row==null){
            LayoutInflater vi=(LayoutInflater)ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            row=vi.inflate(R.layout.checkbox, parent,false);
            myviewholder.text=(TextView)convertView.findViewById(R.id.code);
            myviewholder.tb=(ToggleButton)convertView.findViewById(R.id.checkBox1);
            myviewholder=new ViewHolder();
            position=pos;
            row.setTag(myviewholder);
            //Log.d("KEY", "VIEW CREATED NEWLY");
            //myviewholder.tb.setChecked(btnstate.get(pos));


        }
        else
        {
        myviewholder=(ViewHolder)convertView.getTag();
        Log.d("KEY", "VIEW RECYCLED");  
        btnstate.size();
        btnstate.put(position, true);
        }


        myviewholder.text.setText(getItem(pos).getTime());
        myviewholder.tb.setOnCheckedChangeListener(new OnCheckedChangeListener() {

            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                // TODO Auto-generated method stub
                //myviewholder.tb.setChecked(btnstate.get(position));
                btnstate.putAll(btnstate);
                btnstate.put(position, true);
            }
        });


        return row;
}







private void loadArrayFromFile(){
    try
    {
        InputStream is=ctx.getAssets().open("mrvtoparanur.csv");
        BufferedReader reader=new BufferedReader(new InputStreamReader(is));        
        //Read each line
        while((line = reader.readLine())!=null){
            clock cur = new clock();
            cur.setTime(line);
            this.add(cur);
        }

     } 
         catch (IOException e) {
          e.printStackTrace();
        }

}
}
4

1 に答える 1

1

これを実現する方法はいくつかあります。1 つの方法は、メンバー変数を作成することですArrayList。何かのようなもの

private HashMap<Integer, Boolean> btnState = new HashMap<Integer, Boolean>();

次に、ボタンの状態が true の場合は、それpositiongetView()として追加しtrueます。次に、getView()その位置の項目が真か偽かを毎回チェックし、その値で状態を設定します。

public View getView(int pos,View convertView,final ViewGroup parent){

  ...
  myviewholder.tb.setChecked(btnState.get(position);  

そして、onCheckChangedListener明らかに、リストに値を追加したいと思うでしょう

btnState.put(position, isChecked); // is checked is whatever value you use in your listener

SparseBooleanArrayArrayListを使用することもできますHashMapが、何らかの理由で私のニーズに最も適していると思います。

于 2014-05-30T01:43:29.150 に答える