0

私の質問に関連するすべての記事を検索しましたが、私の問題の解決策が見つかりませんでした。 2つのテキストビューと1つのToggleボタンを持つListViewがあります。トグルボタン(Togle button)上または下にスクロールすると状態が変わります(外に出る)。私はボタンを状態を保持するようにするビューアホルダ(フォーラムで提案されている)を使用していますが、リサイクルプロパティが有効になり、アプリケーションを混乱させます。つまり、複数のトグルボタンはワンクリックで状態を変更します。 私は何をしたいですか? 私のトグルボタンが見えなくなって戻ってくる前の状態を保持し、トグルボタンが1つだけクリックされたときにそのトグルボタンが機能するはずです。ここで がリストビューの切り替えボタンがスクロール時の状態を変更しました

public class ActivityB extends AppCompatActivity { 
    ListView list; 
    Button edit; 
    public String text= ""; 
    public SharedPreferences.Editor editor; 
    public SharedPreferences sharedPreferences; 

    private ArrayList<String> data = new ArrayList<String>(); 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_b); 
     list = (ListView) findViewById(R.id.listView); 
     generateListContent(); 
     list.setAdapter(new MyListadapter(this,R.layout.constraint,data)); 
     edit= (Button) findViewById(R.id.button); 
     sharedPreferences=getSharedPreferences("MyData",Context.MODE_PRIVATE); 
     editor=sharedPreferences.edit(); 
     text=sharedPreferences.getString("Text","Null"); 
     //Toast.makeText(this,text,Toast.LENGTH_LONG).show(); 


    } 

    public void generateListContent() { 
     for (int i = 0; i < 11; i++) { 
      data.add("This is item no " + i); 
     } 

    } 

    private class MyListadapter extends ArrayAdapter<String> { 
     private int layout; 

     ArrayList<String> list; 
     public MyListadapter(@NonNull Context context, @LayoutRes int resource, @NonNull List<String> objects) { 
      super(context, resource, objects); 
      layout=resource; 
      list= (ArrayList<String>) objects; 
     } 

     @NonNull 
     @Override 
     public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) { 
      ViewHolder mainviewHolder=null; 
      if(convertView==null){ 
       LayoutInflater inflater=LayoutInflater.from(getContext()); 
       convertView= inflater.inflate(layout,parent,false); 
       final ViewHolder viewHolder = new ViewHolder(); 
       viewHolder.title= (TextView) convertView.findViewById(R.id.textView); 
      viewHolder.lastone= (TextView) convertView.findViewById(R.id.textView2); 
      viewHolder.button= (ToggleButton) convertView.findViewById(R.id.toggleButton); 

      //mainviewHolder.title.setText(getItem(position)); 
       viewHolder.button.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
        @Override 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
          if (isChecked) { 
           buttonView.setChecked(true); 
           Toast.makeText(getContext(), "Button is On" + position , Toast.LENGTH_LONG).show(); 
          } else { 
           buttonView.setChecked(false); 
           Toast.makeText(getContext(), "Button is OFF" + position + buttonView.getId(),Toast.LENGTH_LONG).show(); 
          } 

        } 
       }); 

       convertView.setTag(viewHolder); 
      } 
      else{ 
       mainviewHolder = (ViewHolder) convertView.getTag(); 
       mainviewHolder.title.setText(getItem(position)); 
      } 
      return convertView; 
     } 
    } 
    public class ViewHolder{ 
     TextView title; 
     TextView lastone; 
     ToggleButton button; 
    } 

} 
+0

はい、View holder pattenが原因です。それは次のデータの再利用のようなものです。 どうすればいいですか? boolean配列(メイン配列のサイズ)を作成し、トグルボタンの状態を保存します。 OnBindビューメソッドで設定できます。 –

答えて

0

チェックこの(多くのコメントを入れないための私を許し)リストビューのための私のコードです...

Recyclerview Changing Items During Scroll

上記の場合は動作しません....

方法1

試してみてください...

1.ボタンのステータスをトグル・メソッドの外にチェックしてください。リストビューがロードされるたびに、値を割り当てずに値を割り当てることができます。

  • インスタンス参照によりBTNトグルを変更.... togglebtnの内部このperticualr項目

  • のインスタンスを渡す//メソッドtogglebtn(viewHolder)を作成。

  • togglebtn(viewHolder V) {}

    方法2

    商品番号+チェックを格納しないためのボタンの状態.... preferebaly hasmapを保持するためにパブリックデータ構造を作成しますステータス....毎回この値をチェックし、更新してください。

    お気軽にお問い合わせください。

    +0

    あなたの回答は役に立ちました... –

    0

    文字列の配列リストを作成する代わりに、以下のようなカスタムオブジェクトを作成します。

    Class A { 
        public String title; 
        public boolean isChecked; 
    } 
    

    トグルボタンの状態に応じてisChecked(true/false)に正しい値を設定します。

    またgetViewメソッド内の1行を(追加)あなたの時間を温存し、私の質問に答えるための

    button.setChecked(list.get(position).isChecked) 
    
    +0

    私のコードで 'button.setChecked()'ステートメントを使用しました。それは助けました。 –

    0

    おかげでみんなを。 これらの回答とフォーラムの他の記事の助けを借りて、私は解決策を見つけました。 私はビューの数が限られているので、レイアウトインフレータのif/else条件を削除しました。これにより、変数positionの再利用が解決されました。現在、すべてのビュー・オブジェクトに固有のpositionがあります。次に、トグルボタンの状態を別の配列に保存し、それを私のgetview()メソッドの外に保つことによって、ランダムなボタンステータスの動作を解決します。

    関連する問題