2017-12-03 6 views
0

私は問題を抱えています。私はトグルスイッチを押すと、リストビューの最後の項目だけが機能します。どのスイッチを切り替えるかは関係ありません。私は他の質問された質問を研究しますが、私はそれを理解できませんでした。listviewトグルスイッチは最後の行だけを扱います

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    View customView = inflater.inflate(R.layout.row, parent, false); 
    String allData = getItem(position); 


    final Switch status = (Switch) customView.findViewById(R.id.switchStatus); 


    status.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
      Toast.makeText(getContext(),"selectid",Toast.LENGTH_LONG).show(); 

     } 
    }); 

    return customView; 

} 

私のアダプターはここで見ることができます。

public class adapter_test extends ArrayAdapter<String> { 



    public adapter_allservicerecords(Context context, String[] data){ 
     super(context, R.layout.row, data); 
    } 

    @Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    View customView = inflater.inflate(R.layout.row, parent, false); 
    String allData = getItem(position); 



     try { 
      if(!all_data.isEmpty()) { 
       JSONObject jsonRowData = new JSONObject(all_data); 
       try { 
        text.setText(jsonRowData.getString("TITLE")); 


       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
     } catch (Exception e) { 
      Log.e("FAILED", "Json parsing error: " + e.getMessage()); 
     } 

    return customView; 

    } 
} 

答えて

2

この問題を解決するには、データをStringとして作成する代わりに、各行を表すものに変更する必要があります。

class Item { 
    String data; 
    boolean toggled; 

    public Item(String data) { 
     this.data = data; 
    } 

    public void setToggled(boolean toggle) { 
     toggled = toggle; 
    } 
} 

あなたの代わりにリストとしてあなたのリストを持っている必要があり、あなたが簡単にあなたの文字列を追加することができますので、あなたのデータソースは今、文字列でなければなりません:あなたはあなたの行を表すために、このクラスを設定することができる。例えば

新しい項目を渡すことによってリストを作成する( "STRING DATA HERE");データをリストに追加するときに使用します。 ので、代わりの

String allData = getItem(position); 

あなたはgetViewメソッドで、その後

Item item = getItem(position); 

を使用するには、次のようになります。

@Override 
public View getView(int position, View convertView, ViewGroup parent) 
{ 
    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    View customView = inflater.inflate(R.layout.row, parent, false); 
    Item item = getItem(position); 


    final Switch status = (Switch) customView.findViewById(R.id.switchStatus); 
    status.set 

    status.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
      // here we change the value of the item which is referring to the specific index in the array returned by getItems() 
      item.setToggled(isChecked); 
      Toast.makeText(getContext(),"selectid",Toast.LENGTH_LONG).show(); 

     } 
    }); 

    // here we get what the latest value of the switch is 
    status.setChecked(item.toggled); 
    return customView; 

} 

あなたはまた、データ構造にデータソースを変更してください/ ListはListやそれに似たものを使いたいと思っています。

BONUSヒント: ビューを保持し、インスタンスを効率的にリサイクルするには、ViewHolderを使用することをお勧めします。

class ViewHolder { 
    Switch statusSwitch; 
    View customView; 
} 

次に、getView()の部分でこれを使用すると簡単に行うことができます。 convertViewまたはメソッドの2番目のパラメータは、nullの場合に再利用またはインスタンス化できるビューを表すため、実際にはビューの新しいインスタンスを作成する必要はありません。

異種リストでは、ビューの種類の数を指定できるため、このビューは常に適切なタイプになっているので、そのビューを使用することをお勧めします。

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    LayoutInflater inflater = LayoutInflater.from(getContext()); 
    ViewHolder holder = null; 
    Item item = getItem(position); 
    if (convertView == null) { // instantiate if not yet instantiated 
     convertView = inflater.inflate(R.layout.supplies_list_item, null); 
     holder.statusSwitch = (Switch) convertView.findViewById(R.id.switchStatus); 
    } 
    else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    // you could set the values/ listeners here 
    holder.statusSwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
     @Override 
     public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
      item.setToggled(isChecked); 
      Toast.makeText(getContext(),"selectid",Toast.LENGTH_LONG).show(); 

     } 
    }); 
    holder.statusSwitch.setChecked(item.toggled); 

    return convertView; 
} 
+0

アイテムアイテム= getItem(位置); gaves Error:(48、28)error:互換性のない型:文字列をエラーに変換できません。 – user7732643

+0

さて、あなたがしなければならないことはItemコンストラクタのStringデータを渡すことです。 –

+0

まだ同じ男です。 – user7732643

関連する問題