【问题标题】:Get row position in ListView with Checkbox in Android使用Android中的复选框获取ListView中的行位置
【发布时间】:2012-06-30 14:14:23
【问题描述】:

我正在编写一个 android 应用程序,但在使用 CheckBox 获取 ListView 中的行位置时遇到问题。

这是模拟器的截图:

我已经用 CheckBoxes 制作了ListView。但我不知道如何找到每个选中条目的行位置。一旦我得到选中的位置,我想实现一个 Remove Selected 动作。

请帮忙!

这是我的代码:

public class ListTest extends ListActivity implements OnCheckedChangeListener {
    @Override 
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        //--- Importing StringsArray---     
        Bundle gotBasketScanner = getIntent().getExtras();
        String[] StringArrayHistory = gotBasketScanner.getStringArray("fromHistory");

        // ---Make Adapter---
        setListAdapter( new ArrayAdapter<String>(ListTest.this,
                    android.R.layout.simple_list_item_multiple_choice,
                    StringArrayHistory));

        // ---Put Array into a ListView and add Checkboxes to Listview
        ListView list = getListView();
        list.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
    }
}

【问题讨论】:

  • 如果您有解决方案,请接受答案:)

标签: android android-listview listactivity


【解决方案1】:

【讨论】:

  • 是的..在问之前我研究了很多..我已经阅读了这些页面(以及更多),但我无法弄清楚 =/ 我正在尝试使用 CHOICE_MODE_MULTIPLE
【解决方案2】:

使用onItemClick() 代替onCheckedChangeListener...

getListView().setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {

@Override
public void onItemClick(AdapterView<?> parent, View view, int position,
                            long id) {
         Toast.makeText(getApplicationContext(), "Item "+position+" is clicked",
                              Toast.LENGTH_SHORT).show();
    }
}

这是获取点击位置和id的更好方法。

希望这能解决你的问题。

编辑

我已更新以下行:-

getListView().setOnItemClickListener(new AdapterView.OnItemClickListener() {

现在试试你的代码。

【讨论】:

  • 谢谢!!我对这个方向感觉很好。我在“新的 OnItemClickListener”上遇到错误。它说“无法实例化类型 AdapterView.OnItemClickListener”......关于解决的任何想法?我会继续努力
  • 谢谢!我最终以另一种方式解决了我的问题——虽然花了我很长时间。再次感谢!
【解决方案3】:

您可以将PrefrenceScreenCheckBoxPreference 一起使用,以实现更轻松且可扩展的实施

【讨论】:

    【解决方案4】:

    您可以使用 CheckedTextView 来实现相同的:

    ma​​in.xml

      <?xml version="1.0" encoding="utf-8"?>
      <CheckedTextView xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" 
        android:clickable="true"
        android:focusable="true"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple">
      </CheckedTextView>
    

    addlist.xml

     <?xml version="1.0" encoding="utf-8"?>
     <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="fill_parent"
       android:layout_height="fill_parent"
       android:orientation="vertical" >
    
      <ListView
         android:id="@+id/mainListView"
         android:layout_width="fill_parent"
         android:layout_height="wrap_content"
         >
      </ListView>
    
      <Button android:id="@+id/click"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="Click"/>
     </LinearLayout>
    

    这里是 GetCheckedTextPositionActivity 活动。单击按钮后,您将检查列表项的位置:

     public class GetCheckedTextPositionActivity extends Activity {
    
    private ListView myList;
    private EfficientAdapter myAdapter;
    private ArrayList<String> data;
    private LayoutInflater mInflater;
    private Button click;
    private ArrayList<Integer> positions;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.addlist);
    
        positions = new ArrayList<Integer>();
    
        data = new ArrayList<String>();
        data.add("Bangalore");
        data.add("Delhi");
        data.add("Patna");
        data.add("Mumbai");
    
        click = (Button)findViewById(R.id.click);
        mInflater = LayoutInflater.from(getApplicationContext());
        myList = (ListView) findViewById(R.id.mainListView);
        myAdapter = new EfficientAdapter(data, getApplicationContext());
        myList.setAdapter(myAdapter);
    
        click.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
                if(positions.size() != 0){
                    for(Integer pos : positions){
                    Log.e("Positions checked :"," Positions :"+pos);
                    }
                }
    
            }
        });
    
    }
    
    public class EfficientAdapter extends BaseAdapter {
        private ArrayList<String> myData;
    
        public EfficientAdapter(ArrayList<String> mData, Context ctx) {
            // TODO Auto-generated constructor stub
            this.myData = mData;
        }
    
        @Override
        public int getCount() {
            // TODO Auto-generated method stub
            return myData.size();
        }
    
        @Override
        public Object getItem(int position) {
            // TODO Auto-generated method stub
            return myData.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            // TODO Auto-generated method stub
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
    
            final int currentPos = position;
    
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.main, null);
            }
    
            ((CheckedTextView) convertView).setText(myData.get(position));
            ((CheckedTextView) convertView).setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                            ((CheckedTextView) v).toggle();
                            if(((CheckedTextView) v).isChecked()){
                                positions.add(currentPos);
                            }
                        }
                    });
            return convertView;
        }
    
    }
     }
    

    希望这会有所帮助。

    【讨论】:

    • 谢谢!在我问我的问题之前,我看到了这种方法。我没有使用这个的原因是1)我的数组是导入的,所以我不能做“data.add”单独引用,2)我不明白这个方法..
    • 你了解什么方法?导入 ArrayList 是什么意思?即使你得到一个 ArrayList,直接使用它,而不是创建一个 ArrayList 并将 Item 添加到它。
    • 感谢您的帮助!昨天和今天几个小时后,我自己弄清楚了代码!我不理解这种方法,因为有 1)一个使用整数来引用位置的 for 循环(我的情况不太适合这种设置); 2) 我不明白 BaseAdapter。但无论如何,我现在解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 2016-01-15
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2023-04-08
    相关资源
    最近更新 更多