【问题标题】:Multi selection in listview列表视图中的多选
【发布时间】:2016-12-31 09:14:13
【问题描述】:

我已经使用数组适配器创建了简单的多选列表视图。我想设置背景颜色特定的列表项。但是假设我选择了 2 项意味着设置背景,并且还设置了第 12 个位置和第 22 个位置,就像自动选择的那样。请提出问题。

黑色代码。

public class MainActivity extends Activity {

ListView lvCountry;

ArrayList<Integer> list = new ArrayList<Integer>();
String[] country = { "India", "USA", "Russsia", "China", "Pakistan",
        "Canada", "UK", "arcot", "vellore", "gudiyattam", "arani",
        "palani", "chennai", "padi", "velacherry", "ambattur",
        "ambatttur ot", "maduravoyal", "guindy" };

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

    lvCountry = (ListView) findViewById(R.id.listView1);
    // Array adapter
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(
            MainActivity.this, android.R.layout.simple_list_item_1, country);
    lvCountry.setAdapter(arrayAdapter);

    // list selection part
    lvCountry.setOnItemClickListener(new OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> arg0, View arg1,
                int position, long arg3) {
            // color selection select item
            arg1.setBackgroundColor(Color.GRAY);
        }
    });
}}

【问题讨论】:

标签: android listview android-arrayadapter


【解决方案1】:

实际上,当您滑动列表视图时,项目正在随机播放。为避免此问题,请将列表视图放在滚动视图中。如果您想要代码示例,我可以提供。

【讨论】:

  • 检查下面的post xml文件和javafile
  • 检查下面的post xml文件和javafile
  • 检查下面的post xml文件和javafile
【解决方案2】:

创建您自己的适配器,其中每个项目都有“已选择”标志,默认清除。在单击侦听器中为给定项目设置标志并强制重绘。你应该使用 RecuclerView,因为它工作得更快。当视图膨胀时,检查选择标志并相应地设置背景

【讨论】:

  • 你没有回答他的问题
【解决方案3】:

XML 文件

      <ScrollView
          android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_marginBottom="5dp"
    android:scrollbars="none"
    android:visibility="gone">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <ListView

            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_margin="1dp"
            android:scrollbars="none"
            android:visibility="visible" />
    </LinearLayout>

</ScrollView>

java类

    listview.setAdapter(agentRequestAdapter);

    setListViewHeightBasedOnChildren(lvAgntRqstView);
         ////////////////////////////

    private static void setListViewHeightBasedOnChildren(ListView myListView) {
    try {
        ListAdapter myListAdapter = myListView.getAdapter();
        if (myListAdapter == null) {
            //do nothing return null
            return;
        }
        //set listAdapter in loop for getting final size
        int totalHeight = 0;
        for (int size = 0; size < myListAdapter.getCount(); size++) {
            View listItem = myListAdapter.getView(size, null, myListView);
            listItem.measure(0, 0);
            totalHeight += listItem.getMeasuredHeight();
        }
        //setting listview item in adapter
        ViewGroup.LayoutParams params = myListView.getLayoutParams();
        params.height = totalHeight + (myListView.getDividerHeight() * (myListAdapter.getCount() - 1));
        myListView.setLayoutParams(params);
        // print height of adapter on log
        Log.i("height of listItem:", String.valueOf(totalHeight));


    } catch (NullPointerException e) {

    }
}

【讨论】:

    【解决方案4】:

    在 bhatt4982 的这个答案中,您可以设置属性以使该选项可用于选择列表中的多个条目:

    首先你可以像这个例子一样在 listView 本身中设置

        listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listView.setItemCanFocus(false);
    

    其次,您可以在布局或 layout_simple_list_item_1.xml 中声明它。 示例:

        <ListView
        ...
        android:background="@drawable/your_drawable"
        android:checkMark="?android:attr/listChoiceIndicatorMultiple"/>
    

    然后你可以在你的自定义drawable中设置背景。

    Source

    【讨论】:

    • arg1.setBackgroundColor(Color.GRAY);//此代码实现,当特定项目点击设置bgcolor并自动选择另一个项目。请帮助
    • 您好先生,我有一个关于屏幕上列表视图中的多选的查询我在列表视图中添加了 20 个项目,但在当前屏幕上只有 7 个项目当我滚动列表视图时它会跟随出现现在我的查询是当我在当前屏幕上多选 2、3、6 之类的项目时,但在第二页(向下滚动)之后的相同时间,在我不知情的情况下选择了这些项目(例如:屏幕 1 有 7 个项目,但我的选择只是2,3,6 仅此而已,但屏幕 2(向下滚动时)选择了 9,10,13 我不知道为什么在屏幕 2 上选择了该项目)你如何解决这个问题?
    【解决方案5】:
    public class MainActivity extends AppCompatActivity {
    
    List<Items> data;
    RecyclerView rv;
    ActionMode actionMode;
    ListAdapterr listAdapterr;
    int countSelected;
    int total;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        rv = (RecyclerView) findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(getApplicationContext()));
        CallAPI();
    
        rv.addOnItemTouchListener(new RecyclerItemClickListener(getApplicationContext(), rv, new RecyclerItemClickListener.OnItemClickListener() {
            @Override
            public void onItemClick(View view, int position) {
    
                if (countSelected > 0)
                {
                    if (actionMode == null)
                    {
                        actionMode = MainActivity.this.startSupportActionMode(call);
                    }
                    toggleSelection(position);
                    String s = countSelected + " " + "S" + " " + total ;
                    actionMode.setTitle(s);
    
                    if (countSelected == 0)
                    {
                        actionMode.finish();
                    }
                }else if (countSelected == 0)
                {
                    Toast.makeText(MainActivity.this, "Ok", Toast.LENGTH_SHORT).show();
                }
            }
    
            @Override
            public void onItemLongClick(View view, int position) {
    
                if (actionMode == null)
                {
                    actionMode = MainActivity.this.startSupportActionMode(call);
                }
                toggleSelection(position);
                String s = countSelected + " " + "S" + " " + total ;
                actionMode.setTitle(s);
    
                if (countSelected == 0)
                {
                    actionMode.finish();
                }
            }
        }));
    
    }
    
    ActionMode.Callback call = new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            mode.getMenuInflater().inflate(R.menu.menu_item,menu);
            actionMode = mode;
            countSelected = 0;
            return true;
        }
    
        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }
    
        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            return false;
        }
    
        @Override
        public void onDestroyActionMode(ActionMode mode) {
            if (countSelected > 0) {
                deselectAll();
            }
            actionMode = null;
        }
    };
    
    ArrayList<Items> selectedList = new ArrayList<>();
    
    private void toggleSelection(int position) {
        data.get(position).isSelected = !data.get(position).isSelected;
    
        if (data.get(position).isSelected) {
            selectedList.add(data.get(position));
            countSelected++;
            total +=Integer.valueOf(data.get(position).getAmount());
        } else {
            selectedList.remove(data.get(position));
            countSelected--;
            total -= Integer.valueOf(data.get(position).getAmount());
        }
        listAdapterr.notifyDataSetChanged();
    }
    
    private void deselectAll() {
        for (int i = 0, l = data.size(); i < l; i++) {
            data.get(i).isSelected = false;
        }
        countSelected = 0;
        listAdapterr.notifyDataSetChanged();
    }
    

    回收站视图:

       public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener {
    public interface OnItemClickListener {
        void onItemClick(View view, int position);
        void onItemLongClick(View view, int position);
    }
    
    private OnItemClickListener mListener;
    private GestureDetector mGestureDetector;
    
    public RecyclerItemClickListener(Context context, final RecyclerView recyclerView, OnItemClickListener listener) {
        mListener = listener;
    
        mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
            @Override
            public boolean onSingleTapUp(MotionEvent e) {
                return true;
            }
    
            @Override
            public void onLongPress(MotionEvent e) {
                View childView = recyclerView.findChildViewUnder(e.getX(), e.getY());
    
                if (childView != null && mListener != null) {
                    mListener.onItemLongClick(childView, recyclerView.getChildAdapterPosition(childView));
                }
            }
        });
    }
    
    @Override
    public boolean onInterceptTouchEvent(RecyclerView view, MotionEvent e) {
        View childView = view.findChildViewUnder(e.getX(), e.getY());
    
        if (childView != null && mListener != null && mGestureDetector.onTouchEvent(e)) {
            mListener.onItemClick(childView, view.getChildAdapterPosition(childView));
        }
    
        return false;
    }
    
    @Override
    public void onTouchEvent(RecyclerView view, MotionEvent motionEvent) {
    }
    
    @Override
    public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
    
    }
    

    }

    【讨论】:

      猜你喜欢
      • 2016-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-29
      相关资源
      最近更新 更多