3

リストビューにArrayAdapterwithを使用しています。選択したアイテムを詳細に表示するアクティビティを起動するリスト ビューandroid.R.layout.simple_list_item_multiple_choiceのハンドラーがあります。onItemClick()

チェックボックスの外でクリックが発生した場合にのみ、このアクティビティを開始したいと思います。チェックボックスがクリックされたときに、チェックボックスのステータスを切り替えて、詳細ビューアクティビティを起動しないようにします。現在、リスト内の任意の場所をクリックすると常に両方が発生しますが、これは望ましくありません。

出来ますか?または、カスタム アダプターを使用して、チェックボックスと onclick ハンドラーを追加する必要がありますか?

4

2 に答える 2

1

これにはクラスを使用できcustom Adapter、カスタムアダプターを使用するコードは

リファレンスチェックはこちら

  public class PlanetsActivity extends Activity {  

  private ListView mainListView ;  
  private Planet[] planets ;  
  private ArrayAdapter<Planet> listAdapter ;  

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

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

    // 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 = (Planet[]) getLastNonConfigurationInstance() ;  
    if ( planets == null ) {  
      planets = new Planet[] {   
          new Planet("Mercury"), new Planet("Venus"), new Planet("Earth"),   
          new Planet("Mars"), new Planet("Jupiter"), new Planet("Saturn"),   
          new Planet("Uranus"), new Planet("Neptune"), new Planet("Ceres"),  
          new Planet("Pluto"), new Planet("Haumea"), new Planet("Makemake"),  
          new Planet("Eris")  
      };    
    }  
    ArrayList<Planet> planetList = new ArrayList<Planet>();  
    planetList.addAll( Arrays.asList(planets) );  

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

  /** Holds planet data. */  
  private static class Planet {  
    private String name = "" ;  
    private boolean checked = false ;  
    public Planet() {}  
    public Planet( String name ) {  
      this.name = name ;  
    }  
    public Planet( String name, boolean checked ) {  
      this.name = name ;  
      this.checked = checked ;  
    }  
    public String getName() {  
      return name;  
    }  
    public void setName(String name) {  
      this.name = name;  
    }  
    public boolean isChecked() {  
      return checked;  
    }  
    public void setChecked(boolean checked) {  
      this.checked = checked;  
    }  
    public String toString() {  
      return name ;   
    }  
    public void toggleChecked() {  
      checked = !checked ;  
    }  
  }  

  /** Holds child views for one row. */  
  private static class PlanetViewHolder {  
    private CheckBox checkBox ;  
    private TextView textView ;  
    public PlanetViewHolder() {}  
    public PlanetViewHolder( TextView textView, CheckBox checkBox ) {  
      this.checkBox = checkBox ;  
      this.textView = textView ;  
    }  
    public CheckBox getCheckBox() {  
      return checkBox;  
    }  
    public void setCheckBox(CheckBox checkBox) {  
      this.checkBox = checkBox;  
    }  
    public TextView getTextView() {  
      return textView;  
    }  
    public void setTextView(TextView textView) {  
      this.textView = textView;  
    }      
  }  

  /** Custom adapter for displaying an array of Planet objects. */  
  private static class PlanetArrayAdapter extends ArrayAdapter<Planet> {  

    private LayoutInflater inflater;  

    public PlanetArrayAdapter( Context context, List<Planet> planetList ) {  
      super( context, R.layout.simplerow, R.id.rowTextView, 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.  
      CheckBox checkBox ;   
      TextView textView ;   

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

        // Find the child views.  
        textView = (TextView) convertView.findViewById( R.id.rowTextView );  
        checkBox = (CheckBox) convertView.findViewById( R.id.CheckBox01 );  

        // 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 View.OnClickListener() {  
          public void onClick(View v) {  
            CheckBox cb = (CheckBox) 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 Object onRetainNonConfigurationInstance() {  
    return planets ;  
  }  
}  
于 2012-07-20T06:53:16.553 に答える
0

あなたはこのようにすることができます

public class MainActivity extends ActionBarActivity implements OnClickListener {

Button mbtn_submit;

ListView mlistview;

List<String> namesList;

ArrayAdapter<String> adapter;

String names[] = { "Divya", "Kavya", "Janu", "Anu", "Sneha", "Vistnu",
        "Ravi", "Anil" };

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    mlistview = (ListView) findViewById(R.id.listview);
    mbtn_submit = (Button) findViewById(R.id.btn_submit);

    namesList = new ArrayList<String>();
    for (int i = 0; i < names.length; i++) {

        namesList.add(names[i]);
    }
    adapter = new ArrayAdapter<>(this,
            android.R.layout.simple_list_item_multiple_choice, namesList);
    mlistview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    mlistview.setAdapter(adapter);

    mbtn_submit.setOnClickListener(this);
}

@Override
public void onClick(View v) {

    SparseBooleanArray checked = mlistview.getCheckedItemPositions();

    ArrayList<String> selectedItems = new ArrayList<String>();

    for (int i = 0; i < checked.size(); i++) {
        int position = checked.keyAt(i);
        if (checked.valueAt(i))
            selectedItems.add(adapter.getItem(position));
    }
    String[] selectedItemsArr = new String[selectedItems.size()];

    for (int i = 0; i < selectedItems.size(); i++) {
        selectedItemsArr[i] = selectedItems.get(i);
    }

    Intent intent = new Intent(MainActivity.this,
            SelectedListActivity.class);

    Bundle bundle = new Bundle();
    bundle.putStringArray("selectedItems", selectedItemsArr);

    intent.putExtras(bundle);

    startActivity(intent);
}
}

とselectedList

public class SelectedListActivity extends ActionBarActivity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_selected_list);

    Bundle bundle = getIntent().getExtras();
    String[] resultArr = bundle.getStringArray("selectedItems");
    ListView lv = (ListView) findViewById(R.id.selectedList);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,
            android.R.layout.simple_list_item_1, resultArr);
    lv.setAdapter(adapter);
}
}
于 2016-03-11T09:18:39.920 に答える