1

Как я могу реализовать реализацию Java или XML-кода для выделения (или отображения флажка) строки списка или элемента сетки в режиме множественного выбора в Android для использования с контекстными действиями бар?Как выделить или проверить выбранные элементы списка

Я реализовал контекстную панель действий и ListView/GridView, и я могу выбирать их и запускать функции по выбранным элементам, но визуальная обратная связь отсутствует, кроме краткого выделения строки/элемента списка при длительном нажатии на нем, который исчезает, когда он освобождается.

Моя первая мысль заключалась в том, чтобы установить цвет фона строки/элемента в адаптере, но я не могу заставить его работать. Я также попробовал решение, предложенное принятым ответом на этот вопрос: Android ListView Multi-Choice don't show highlight after chlicking, но это не повлияло на поведение моего ListView и GridView.

Меня больше всего интересует стандартный способ сделать это в соответствии с указаниями по разработке материалов и/или наиболее распространенным способом. Заранее благодарю за любой совет или решение.

EDIT

Я попытался ответить Redman (в самом деле что-то похожее на него, как я использую режим контекстную действий и множественного выбора слушателя), но я не получил никакого результата. Вот что я сделал в слушателе:

public void onItemCheckedStateChanged(ActionMode actionMode, int i, long id, boolean checked) { 
      if (checked) { 
       selectedItems.add(listAdapter.getItem(i)); 
       ((CheckBox) listAdapter.getView(i,null,listView).findViewById(R.id.listCheckBox)).setChecked(true); 
      } 
      else { 
       selectedItems.remove(listAdapter.getItem(i)); 
       ((CheckBox) listAdapter.getView(i,null,listView).findViewById(R.id.listCheckBox)).setChecked(false); 
      } 
     } 

Он работает без ошибок, но он ничего не делает с флажком, так что я не уверен, что проблема есть. Любая помощь действительно ценится.

+0

listview имеет подходящее приложение: селектор. Попробуйте использовать это, для этого вам нужно создать xml-файл в выпадающей папке, который содержит выбранное значение true или по умолчанию false, где вы можете назначить цвета –

+0

@Mohammad вы можете предоставить нам ожидаемые скриншоты и текущий рабочий скриншот, чтобы он даст больше разъяснений при интерпретации ваших ожиданий. – ChaitanyaAtkuri

ответ

1

«Меня больше всего интересует стандартный способ сделать это в соответствии с инструкциями по разработке материалов и/или наиболее распространенным способом».

Я не уверен, что мой ответ материальный или общий, но я сделал GridView, основанный на обработке выбора в приложении Google «Фотографии». Я протестировал его и знаю, что он будет включать выделенную границу и «флажок».

** дисклеймеры **

Я считал, используя селектор, но там, кажется, с этим проблем, если ваш вид свитки (см this). Кроме того, я использовал пользовательский флажок (на самом деле всего две разные возможности), частично из-за this. Кроме того, этот ответ в основном обрабатывает телефон в портретном режиме. Необходимо добавить дополнительные элементы для обработки различных конфигураций (размер экрана, ориентация и т. Д.)

Здесь много, но, как я уже сказал, я его протестировал. Конечно, я не буду включать весь проект, но если вам нужно, я могу отправить его в GitHub. В любом случае, я это сделаю.

первый в MainActivity OnCreate()

mList = new ArrayList<>(); 

// fill your list here 

mAdapter = new GridAdapter(getApplicationContext(), R.layout.grid_item, mList); 
GridView gridView = (GridView)findViewById(R.id.grid_view); 
gridView.setAdapter(mAdapter); 
gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
     Log.d(TAG, "item clicked = " + i); 
     boolean isSelected = mList.get(i).isSelected(); 
     mList.get(i).setSelected(!isSelected); 

     mAdapter.notifyDataSetChanged(); 
    } 
}); 

Далее overide GetView() в адаптере (я использую ArrayAdapter)

@NonNull 
@Override 
public View getView(int position, View convertView, @NonNull ViewGroup parent) { 

    RelativeLayout itemLayout; 

    GridItem gridItem = (GridItem)getItem(position); 

    // use existing Views when we can 
    if(convertView == null) { 
     LayoutInflater inflater = (LayoutInflater) 
       getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     itemLayout = (RelativeLayout) inflater.inflate(R.layout.grid_item, null); 
    } else { 
     itemLayout = (RelativeLayout) convertView; 
    } 

    // get your bitmap or list item etc. here 
    BitmapDrawable bitmap = gridItem.getBitmap(); 
    ImageView imageView = (ImageView)itemLayout.findViewById(R.id.image_view); 
    imageView.setBackground(bitmap); 

    if(gridItem.isSelected()) { 
     final int PADDING = 16; 

     Log.d(TAG, "position " + position + " is selected"); 
     itemLayout.findViewById(R.id.image_frame).setPadding(PADDING, PADDING, PADDING, PADDING); 
     itemLayout.findViewById(R.id.custom_check_box) 
       .setBackgroundResource(R.drawable.custom_check_box_selected); 
    } else { 
     Log.d(TAG, "postion " + position + " is NOT selected"); 
     itemLayout.findViewById(R.id.image_frame).setPadding(0,0,0,0); 
     itemLayout.findViewById(R.id.custom_check_box) 
       .setBackgroundResource(R.drawable.custom_check_box_unselected); 
    } 
    return itemLayout; 
} 

Вот ядро ​​класса GridItem, оставил геттеры & сеттеры.

public class GridItem { 

    private BitmapDrawable bitmap = null; 
    private boolean isSelected = false; 

    public GridItem(BitmapDrawable bitmap) { 
     this.bitmap = bitmap; 
    } 
} 

Это все для Java. Теперь некоторые XML

grid_item.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@color/colorAccent" 
    > 
    <FrameLayout 
     android:layout_width="140dp" 
     android:layout_height="140dp" 
     android:id="@+id/image_frame" 
     > 
     <!-- view for the main image --> 
     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:scaleType="center" 
      android:background="@android:color/white" 
      android:id="@+id/image_view" 
      /> 
    </FrameLayout> 

    <!-- view for the 'checkbox' in upper left corner --> 
    <ImageView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_margin="2dp" 
     android:src="@drawable/custom_check_box_unselected" 
     android:id="@+id/custom_check_box" 
     /> 
</RelativeLayout> 

И это пойти бы в content_main.xml или activity_main.xml и т.д.

<GridView 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:numColumns="2" 
    android:verticalSpacing="10dp" 
    android:horizontalSpacing="20dp" 
    android:stretchMode="columnWidth" 
    android:gravity="center" 
    android:id="@+id/grid_view" 
    > 
</GridView> 

И теперь 2 файлов для вашей вытяжке папки.

custom_check_box_unselected.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:height="20dp" 
    android:width="20dp" 

    android:viewportWidth="400" 
    android:viewportHeight="400"> 

    <!-- the outside box --> 
    <!-- top line & top left corner --> 
    <path android:pathData="M 340 30 H 62 c -20 0 -35 15 -35 35 " 
     android:strokeColor="#000000" android:strokeWidth="20" /> 

    <!-- left line & bottom left corner --> 
    <path android:pathData="M 27 64 v271 c0 20 15 35 35 35 " 
     android:strokeColor="#000000" android:strokeWidth="20" /> 

    <!-- bottom line & bottom right corner --> 
    <path android:pathData="M 60 370 h275 c20 0 35 -15 35 -35" 
     android:strokeColor="#000000" android:strokeWidth="20" /> 

    <!-- right line & top right corner --> 
    <path android:pathData="M 370 336 v -271 c0 -20 -15 -35 -35 -35" 
     android:strokeColor="#000000" android:strokeWidth="20" /> 
</vector> 

custom_check_box_selected.xml

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:height="20dp" 
    android:width="20dp" 

    android:viewportWidth="400" 
    android:viewportHeight="400"> 

    <!-- the outside box --> 
    <path android:pathData="M 340 30 H 62 c -20 0 -35 15 -35 35 
      v271 c0 20 15 35 35 35 
      h275 c20 0 35 -15 35 -35 
      v -271 c0 -20 -15 -35 -35 -35 " 
     android:fillColor="#FDD835" android:strokeColor="#000000" android:strokeWidth="20" /> 

    <!-- the check mark --> 
    <path android:pathData="M 140 320 l -100 -100 25 -30 
      l 75 75 l 190 -190 
      l 25 30 l -190 190" 
     android:fillColor="#000000" android:strokeColor="#000000" android:strokeWidth="2" /> 
</vector> 
+0

Не могли бы вы добавить класс GridItem? (Только основной код класса) Спасибо. –

+0

Добавлен код GridItem для Java – Gary99

0

Вы можете показать флажок в ListView с множественным выбором следующим способом

добавить флажок в списке дочерних XML и установить его интерактивным ложен в XML

android:clickable="false" 

и для списка OnItemSelectedListner сохранить этот

ArrayList<Integer> listPositionsSaveArray= new ArrayList<Integer>(); 

    listview.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

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

        CheckBox presentCheckBox=(CheckBox)view.findViewById(R.id.checkbox__list); 

        if(presentCheckBox.isChecked()){ 
          presentCheckBox.setChecked(false); 
          listPositionsSaveArray.removeAll(Arrays.asList(position+1)); 
        } 
        else{ 
        presentCheckBox.setChecked(true); 
        listPositionsSaveArray.add(position+1); 
        } 


      } 
     }); 

все выбранные позиции вида списка будут в listPositionsSaveArray сейчас

-1

Это очень просто. В файле макета использовать этот атрибут в ListView:

android:choiceMode="singleChoice" 
android:listSelector="#666666" 

Если вы хотите сделать это программно, то попробуйте следующее:

listView.setSelector(Drawable selector) 

listView.setSelector(int resourceId) 

listview.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); 

Если вы хотите использовать множественный выбор AbsListView.CHOICE_MODE_MULTIPLE.

+0

Это не ответ на мой вопрос. Все, что вы делаете, это изменение цвета селектора. Пожалуйста, прочитайте вопрос. –

+0

Я даю вам кусок кода, позвольте мне, если эта работа. –

0

По моему разумению вы хотите изменить цвет ListView строки, когда пользователь проверяет, что флажок, ..

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 

     for (int j = 0; j < adapterView.getChildCount(); j++) 
      adapterView.getChildAt(j).setBackgroundColor(Color.TRANSPARENT); 

     // change the background color of the selected element 
     view.setBackgroundColor(Color.LTGRAY); 
}); 

вы можете использовать свою логику для реализации этого изменяющегося цвета согласно вашему требованию

2

Okk Для множественного выбора Вам нужна модель, адаптер. Поэтому вам нужно сделать customlistview.I даны ниже примера. Вам просто нужно заменить markAttendance_detail (TextView) на флажок, и если он установит флажок «P», установите флажок еще не проверено. И если у вас возникнут какие-либо проблемы, сообщите мне об этом.

Adaper Класс ->

public class AttendanceAdapter extends ArrayAdapter { 

    List list = new ArrayList(); 

    static class DataHolder { 
     TextView rollNo_detail,studentName_detail,markAttendance_detail; 
    } 

    public AttendanceAdapter(Context context, int resource) { 
     super(context, resource); 
    } 
    @Override 
    public void add(Object object) { 
     super.add(object); 
     list.add(object); 
    } 
    @Override 
    public int getCount() { 
     return this.list.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return this.list.get(position); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     View row; 
     row = convertView; 
     final DataHolder dataHolder; 
     if (convertView == null) { 
      LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      row = inflater.inflate(R.layout.attendance_list, parent, false); 
      dataHolder = new DataHolder(); 

      dataHolder.rollNo_detail=(TextView)row.findViewById(R.id.student_rollno); 
      dataHolder.studentName_detail=(TextView)row.findViewById(R.id.student_name); 
      dataHolder.markAttendance_detail=(TextView)row.findViewById(R.id.mark_attendance); 
      dataHolder.markAttendance_detail.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) { 
        AttendanceModel model=(AttendanceModel) dataHolder.markAttendance_detail.getTag(); 
        String att=model.getAttendance().toString(); 
        if (model.isSelected()==false){ 
         model.setSelected(true); 
         dataHolder.markAttendance_detail.setText("P"); 
        }else if (model.isSelected()==true){ 
         model.setSelected(false); 
         dataHolder.markAttendance_detail.setText("A"); 
        } 
       } 

      }); 
      row.setTag(dataHolder); 
      dataHolder.markAttendance_detail.setTag(list.get(position)); 

     } 
     else { 
      dataHolder = (DataHolder) row.getTag(); 
      ((DataHolder) row.getTag()).markAttendance_detail.setTag(list.get(position)); 

     } 
     AttendanceModel model = (AttendanceModel) this.getItem(position); 

     dataHolder.rollNo_detail.setText(model.getRoll_no()); 
     dataHolder.studentName_detail.setText(model.getStudent_name()); 
     if (model.isSelected()==true){ 
      dataHolder.markAttendance_detail.setText("P"); 
     }else if (model.isSelected()==false){ 
      dataHolder.markAttendance_detail.setText("A"); 
     } 
     return row; 
    } 

Модель Должно быть, как это ->

public class AttendanceModel { 
    private String roll_no; 
    private String student_name; 
    private String attendance; 
    private boolean selected; 
    public AttendanceModel(String roll_no,String student_name,String attendance){ 
     this.roll_no=roll_no; 
     this.selected=true; 
     this.student_name=student_name; 
     this.attendance=attendance; 
    } 

    public boolean isSelected() { 
     return selected; 
    } 

    public void setSelected(boolean selected) { 
     this.selected = selected; 
    } 

    public String getRoll_no() { 
     return roll_no; 
    } 

    public void setRoll_no(String roll_no) { 
     this.roll_no = roll_no; 
    } 

    public String getStudent_name() { 
     return student_name; 
    } 

    public void setStudent_name(String student_name) { 
     this.student_name = student_name; 
    } 

    public String getAttendance() { 
     return attendance; 
    } 

    public void setAttendance(String attendance) { 
     this.attendance = attendance; 
    } 
} 

И активность должна быть, как это ->

public class Attendance_Page extends AppCompatActivity { 
    ListView listView; 
    AttendanceModel model; 
    AttendanceAdapter attendanceAdapter; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_atendance_page); 
     listView= (ListView) findViewById(R.id.attendancepage_list_view); 
    attendanceAdapter=new AttendanceAdapter(getApplicationContext(),R.layout.attendance_list); 
     listView.setAdapter(attendanceAdapter); 
     for (int i=1;i<=10;i++){ 
      model=new AttendanceModel("1","Aryan","P"); 
      attendanceAdapter.add(model); 
     } 
    } 
} 

С моей точки это может быть решением, если не дать мне знать.

Смежные вопросы