【问题标题】:how to get the previous checked position in list view如何在列表视图中获取上一个选中的位置
【发布时间】:2016-12-05 11:00:34
【问题描述】:

实际上,当我触摸列表视图时,我有一个列表视图,当我选中复选框并按 OK 时,我会弹出带有复选框的窗口,然后对话框关闭,当我再次触摸列表视图时,选中的行位置将改变背景颜色并存储到数据库中。实际上问题是当我再次选择不同的项目位置并检查并按 OK 并再次触摸列表视图而不是输入检查的位置进入数据库时​​,先前检查的位置也与当前检查的位置一起进入数据库。所以我需要在列表视图看到选中的位置之前获得以前的位置和清除位置。使其只进入当前位置。

我的活动

listView1.setOnTouchListener(new AdapterView.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_UP) {
            newListitems2.clear();
            newListitems2.addAll(itemsList1);

            dialog = new Dialog(PendingOrdersActitvity.this);
            dialog.setContentView(R.layout.itembumping);

            dialog.show();

            //listView1.setTag(position);
            list1 = (ListView) dialog.findViewById(R.id.list1);

            ItemBumpingAdapter adapter2 = new ItemBumpingAdapter(PendingOrdersActitvity.this, newListitems2);
            list1.setAdapter(adapter2);

            Button okButton = (Button) dialog.findViewById(R.id.ok1);
            okButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    dialog.dismiss();
                }
            });
            Button cancelButton = (Button) dialog.findViewById(R.id.Cancel1);
            cancelButton.setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    // TODO Auto-generated method stub
                    dialog.dismiss();
                }
            });
        }
        return true;
    }
});

实现代码:

listView1.setOnTouchListener(new AdapterView.OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                       if(event.getAction() == MotionEvent.ACTION_UP){



                     newListitems2.clear();
                  newListitems2.addAll(itemsList1);

                     dialog = new Dialog(PendingOrdersActitvity.this);
                        dialog.setContentView(R.layout.itembumping);

                        dialog.show();





                        list1=(ListView )dialog.findViewById(R.id.list1);


                        ItemBumpingAdapter adapter2 = new ItemBumpingAdapter(PendingOrdersActitvity.this,newListitems2);
                        list1.setAdapter(adapter2);






                        Button okButton = (Button)dialog.findViewById(R.id.ok1);
                        okButton.setOnClickListener(new OnClickListener() {

                            @Override
                            public void onClick(View v) {

                                dialog.dismiss();


                                Connection con1 = DbHandler.dbConnection();
                                try{
                                PreparedStatement stmt1 = con1
                                        .prepareStatement("Select Line_No, ItemName,DeleteFlag from PendingOrders_Dtl where Inv_No=? ");

                                stmt1.setString(1,invNo);
                                ResultSet rsSetup1 = stmt1.executeQuery();


                                if (rsSetup1.next()) {
                                    ItemsBean bean1 = new ItemsBean();


                                        bean1.setLinenum(rsSetup1.getInt("Line_No"));
                                        bean1.setProdnum(rsSetup1.getInt("ItemName"));

                                        bean1.setDeleteFlag(rsSetup1.getInt("DeleteFlag"));
                                    disablelist.add(bean1);



                                }

                                CustomAdapter adapter1 = new CustomAdapter(PendingOrdersActitvity.this, itemsList1);
                                    for(int i=0;i<itemsList1.size();i++)
                                    {
                                        for(int j=0;j<disablelist.size();j++)
                                        {
                                        if(itemsList1.get(i).getProdnum()==disablelist.get(j).getProdnum())
                                        {

                                            itemsList1.get(i).setSelection(true);



                                        }




                            }
                            }
                                }
                                catch(Exception e)
                                {
                                    e.printStackTrace();
                                }
                            }

                 });

【问题讨论】:

  • 尝试添加“list1.clearChoices();”在创建适配器 2 之前。希望有所帮助!
  • 我会努力的,谢谢
  • 对不起!误解了你的问题。您选中的是 CheckBox,而不是 ListItem。因此尝试添加:“for(int i=0; i
  • 你能在代码中实现这个吗
  • 表示请在我的代码中编辑

标签: android listview checkbox


【解决方案1】:

试试这样的

  int previousPosition;

     public int getPreviousPosition() {
return previousPosition;
 }


 public void setPreviousPosition(int previousPosition) {
this.previousPosition = previousPosition;
 }

在你的列表视图中选择监听器

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

         int prePos=  getPreviousPosition();
      // do what ever you want to do with this prePos      



     View viewchild= parent.getChildAt(getPreviousPosition());
            CheckBox prevCheckBox=(CheckBox)viewchild.findViewById(R.id.Checkbox_sort_list);
            prevCheckBox.setChecked(false);

      //at ending of list view write this
            setPreviousPosition(position);

        }
    });

【讨论】:

  • 但是如何才能在位置之前清除并停止进入数据库
  • 我没有完全理解你的问题,如果你想让前面的复选框不被选中,我已经编辑了代码来做到这一点
【解决方案2】:

我想你在itemList1中保留了checked位置,所以你复制到newListitems2后,需要清除newListitems2中的checked位置。 试试这个:

listView1.setOnTouchListener(new AdapterView.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
    if (event.getAction() == MotionEvent.ACTION_UP) {
        newListitems2.clear();
        newListitems2.addAll(itemsList1);

        dialog = new Dialog(PendingOrdersActitvity.this);
        dialog.setContentView(R.layout.itembumping);

        dialog.show();

        //listView1.setTag(position);
        list1 = (ListView) dialog.findViewById(R.id.list1);

        // Uncheck all items of newListitems2
        for(int i=0; i<newListitems2.size(); i++){
            ItemsBean tmpItem = newListitems2.get(i);
            tmpItem.setChecked(false);
            newListitems2.remove(i);
            newListitems2.add(i, tmpItem);
        }

        ItemBumpingAdapter adapter2 = new ItemBumpingAdapter(PendingOrdersActitvity.this, newListitems2);
        list1.setAdapter(adapter2);

        Button okButton = (Button) dialog.findViewById(R.id.ok1);
        okButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                dialog.dismiss();
            }
        });
        Button cancelButton = (Button) dialog.findViewById(R.id.Cancel1);
        cancelButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                dialog.dismiss();
            }
        });
    }
    return true;
}
});

关于其他问题:

方法一:

如果弹出对话框中的列表与主列表相同,则可以尝试:当对话框关闭时,从弹出对话框中获取列表并将其复制到主列表。

  1. 在 Adapter 类中添加方法以从 adapter2 中获取列表:

    public ArrayList<ItemsBean> getItemList(){
       return newListitems;
    }
    
  2. 单击确定按钮时,覆盖主列表并关闭对话框:

    itemsList1 = adapter2.getItemList();
    adapter1 = new ItemBumpingAdapter(PendingOrdersActitvity.this, itemList1);
    adapter1.notifyDataSetChanged();
    dialog.dismiss();
    

方法二:

  1. 向adapter1添加方法以检查项目:

    public void checkItemsAccordingDatabase(){
        for(int i=0; i<newListItems; i++){
            ItemsBean tmpItem = newListItems.get(i);
            // query tmpItem in database.
            // if tmpItem exits, newListItems.get(i).setChecked(true).
        }
        notifyDataSetChanged();
    } 
    
  2. 点击确定按钮后,更新主列表并关闭对话框:

    adapter1.checkItemsAccordingDatabase();
    dialog.dismiss();
    

【讨论】:

  • ListItem tmpItem = newListitems2.get(i);
  • 您在列表中的项目是什么?在您的邮政编码中,我没有找到它,所以我将其设为 ListItem。
  • 好的,谢谢,但我还有其他问题需要您帮助我
  • 请先检查这是否有效。其他问题是否与帖子有关?
  • 我无法给出项目名称,因为它正在使用 bean 类型 arraylist 。所以在适配器中,当我检查然后进入数据库而不是在加载列表视图后进入时,我使用了代码。所以现在我有另一个与同一个项目相关的问题
【解决方案3】:

试试这个:

// Move this after setSelection.
// CustomAdapter adapter1 = new CustomAdapter(PendingOrdersActitvity.this, itemsList1);

for(int i=0;i<itemsList1.size();i++){
    for(int j=0;j<disablelist.size();j++){
        if(itemsList1.get(i).getProdnum()==disablelist.get(j).getProdnum()){
            itemsList1.get(i).setSelection(true);
            break;
        }
    }
}      
CustomAdapter adapter1 = new CustomAdapter(PendingOrdersActitvity.this, itemsList1);
listView1.setAdapter(adapter1);

并修改 CustomAdapter 的 getView() 类似于您的 ItemBumpingAdapter:

if(newListItems.isSelected()){
    convertView.setBackgroundColor(...);
else{
    convertView.setBackgroundColor(...);
}
retrun convertView;

【讨论】:

  • tnq 对你的时间响应非常重要,我通过获取我编辑的问题来实现代码
  • 现在正在检查位置,问题是如何将背景颜色更改为该数组列表
  • 正在获取主列表位置 itemsList1.get(i).setSelection(true);现在如何更改背景颜色
  • 我试过你上次编辑的,但在选择时显示错误
  • 我看到你有 setSelection(true) 这应该是 ItemsBean 中的一个方法,所以我认为你在 ItemsBean 中也有方法 isSelected() 。如果没有,那么您需要在 ItemsBean 类中创建它[类似于 ItemsBean 中的 setChecked() 和 isChecked()]。或者你可以使用 setChecked() 和 isChecked() 代替。
猜你喜欢
  • 2014-09-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 2018-11-26
  • 2017-07-01
相关资源
最近更新 更多