2013-03-04 18 views
2

如何讓所有的切換按鈕的狀態出現在列表視圖中的Android如何讓所有的切換按鈕的狀態出現在列表視圖的Android

public View getView(int position, View convertView, ViewGroup parent) 
    { 
     pos = position; 

     ApplicationInfo entry = ai.get(position); 
     String str = insatllApps.get(position); 
     System.out.println("Position============"+(insatllApps.get(position))); 
     //Log.d("Check>>:","size>>"+insatllApps.size()); 
     convertView = mInflater.inflate(R.layout.list__button, null); 
     t1=(TextView)convertView.findViewById(R.id.textView1); 
     iv=(ImageView)convertView.findViewById(R.id.imageView1); 
     tb1=(ToggleButton)convertView.findViewById(R.id.togal); 
     tb1.setOnClickListener(this); 
     tb1.setTag(pos); 
     tb1.setTag(R.id.togal, str); 

     iv.setImageDrawable(entry.loadIcon(mPackManager)); 


     t1.setText(str); 


     return convertView; 
    } 

    @Override 
    public void onClick(View v) { 

     switch (v.getId()) 
     { 
     case R.id.togal: 

      String str = ""+v.getTag(R.id.togal); 
      boolean status; 

      Log.d("samit", "str>>>>"+str); 

      //Integer in = Integer.getInteger(str); 
      //Log.d("samit", "in>>>>"+in); 
      //int i =in.intValue(); 
      //Toast.makeText(context, "samit id>>"+v.getTag(), Toast.LENGTH_LONG).show(); 
      Toast.makeText(context, "samit id>>"+str, Toast.LENGTH_LONG).show(); 
      //Log.d("samit", "id>>>>"+i); 

      break; 
     } 
    } 

在這裏,我想在所有存在的切換按鈕的狀態列表視圖

回答

3

使用ArrayAdapter代替baseAdapter通過使用這個你可以解決滾動問題。 中的onStop(下)保存在sharedpreference和在onStart()您檢索從sharedpreference

public class PlanetArrayAdapter extends ArrayAdapter<Planet> { 

private LayoutInflater inflater; 

public PlanetArrayAdapter(Context context, List<Planet> planetList) { 
super(context, R.layout.checklist, R.id.textView1, planetList); 
// Cache the LayoutInflate to avoid asking for a new one each time. 
inflater = LayoutInflater.from(context) ; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
// Planet to display 
Planet planet = (Planet) this.getItem(position); 

// The child views in each row. 
ToggleButton checkBox ; 
TextView textView ; 

// Create a new row view 
if (convertView == null) { 
    convertView = inflater.inflate(R.layout.checklist, null); 

    // Find the child views. 
    textView = (TextView) convertView.findViewById(R.id.textView1); 
    checkBox = (ToggleButton) convertView.findViewById(R.id.checkBox1); 

    // Optimization: Tag the row with it's child views, so we don't have to 
    // call findViewById() later when we reuse the row. 
    convertView.setTag(new PlanetViewHolder(textView,checkBox)); 

    // If CheckBox is toggled, update the planet it is tagged with. 
    checkBox.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     // TODO Auto-generated method stub 
     ToggleButton cb = (ToggleButton) v ; 
     Planet planet = (Planet) cb.getTag(); 
     planet.setChecked(cb.isChecked()); 
    } 
}); 

} 
// Reuse existing row view 
else { 
    // Because we use a ViewHolder, we avoid having to call findViewById(). 
    PlanetViewHolder viewHolder = (PlanetViewHolder) convertView.getTag(); 
    checkBox = viewHolder.getCheckBox() ; 
    textView = viewHolder.getTextView() ; 
} 

// Tag the CheckBox with the Planet it is displaying, so that we can 
// access the planet in onClick() when the CheckBox is toggled. 
checkBox.setTag(planet); 

// Display planet data 
checkBox.setChecked(planet.isChecked()); 
textView.setText(planet.getName());   

return convertView; 
} 

} 

//我的活動類是值的值....

public class MainActivity extends Activity { 

private ListView mainListView; 
//private Planet[] planets; 
ArrayList<Planet> planets=new ArrayList<Planet>(); 
private ArrayAdapter<Planet> listAdapter; 

/** Called when the activity is first created. */ 
@SuppressWarnings("unchecked") 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 

    // Find the ListView resource. 
    mainListView = (ListView) findViewById(R.id.listView1); 

    // When item is tapped, toggle checked properties of CheckBox and 
    // Planet. 

    mainListView 
      .setOnItemClickListener(new AdapterView.OnItemClickListener() { 
       @Override 
       public void onItemClick(AdapterView<?> parent, View item, 
         int position, long id) { 
        Planet planet = listAdapter.getItem(position); 
        planet.toggleChecked(); 
        PlanetViewHolder viewHolder = (PlanetViewHolder) item 
          .getTag(); 
        viewHolder.getCheckBox().setChecked(planet.isChecked()); 
       } 
      }); 

    // Create and populate planets. 
    //planets = (ArrayList<Planet>) getLastNonConfigurationInstance(); 

    planets.add(new Planet("1", false)); 
    planets.add(new Planet("2", false)); 
    planets.add(new Planet("3", false)); 
    planets.add(new Planet("4", false)); 
    planets.add(new Planet("5", false)); 
    planets.add(new Planet("6", false)); 
    planets.add(new Planet("7", false)); 
    planets.add(new Planet("8", false)); 
    planets.add(new Planet("9", false)); 
    planets.add(new Planet("10", false)); 
    planets.add(new Planet("11", false)); 
    planets.add(new Planet("12", false)); 
    planets.add(new Planet("13", false)); 
    planets.add(new Planet("14", false)); 


    // Set our custom array adapter as the ListView's adapter. 
    listAdapter = new PlanetArrayAdapter(this, planets); 
    mainListView.setAdapter(listAdapter); 
} 

public Object onRetainNonConfigurationInstance() { 
    return planets; 
} 
@Override 
protected void onStop() { 
    // TODO Auto-generated method stub 
    super.onStop(); 
    for(int i=0;i<planets.size();i++){ 
     Planet planet = listAdapter.getItem(i); 
     planet.toggleChecked(); 
     System.out.println("position is checked"+i+"="+planet.isChecked()); 

     SharedPreferences sp=getSharedPreferences("MY_DATA",MODE_PRIVATE); 
     SharedPreferences.Editor et=sp.edit(); 
     et.putString(""+i, ""+planet.isChecked()); 
     et.commit(); 
    } 
} 
@Override 
protected void onStart() { 
    // TODO Auto-generated method stub 
    super.onStart(); 
    SharedPreferences pf=getSharedPreferences("MY_DATA", MODE_PRIVATE); 
    for(int i=0;i<planets.size();i++){ 
     Log.v("===i===",""+pf.getString(""+i,"")); 
     if(pf.getString(""+i,"").equals("false")){ 
     planets.set(i, new Planet(""+i, true)); 
     } 
     else{ 

     } 
    } 

} 
} 
2

如果您想要爲後備陣列中的每個項目切換,這將不起作用。 listView只保留N行,其中N是適合屏幕的任何東西。上面或下面的行實際上並不存在,因此您無法查詢切換的值。你必須做的是保存一個數組,該數組保存切換的值,並在該位置可見時設置這些值。

例如,我看到您有一個ApplicationInfo數組和一個您獲得的位置的字符串數組。相反,您應該有一個ListItems類的數組,其中包含每行的ApplicationInfo,名稱和切換值。當調用getView時,將這些值填入行視圖。當某人切換切換時,您應該有一個onClickListener,它將新值保存回ListItems數組。

+0

可以請給我舉例與我的代碼關聯 – Raja 2013-03-04 04:31:22

相關問題