gpt4 book ai didi

android - 如何突出显示或检查选定的列表项

转载 作者:行者123 更新时间:2023-11-29 19:25:55 25 4
gpt4 key购买 nike

我应该如何实现 Java 或 XML 代码以在 Android 的多选模式模式下突出显示(或显示复选框)列表行或网格项以与上下文操作栏一起使用?

我已经实现了上下文操作栏和 ListView/GridView,我可以选择它们并在所选项目上运行函数,但是除了长按时列表行/项目的短暂突出显示外,没有任何视觉反馈它,当它被释放时消失。

我的第一个想法是在适配器中设置行/项目的背景颜色,但我似乎无法让它工作。我也尝试过这个问题的公认答案所建议的解决方案:Android ListView Multi-Choice don't show highlight after chlicking但它对我的 ListView 和 GridView 的行为没有任何影响。

我最感兴趣的是根据 Material 设计指南和/或最常见的方式了解执行此操作的标准方式。预先感谢您提供任何建议或解决方案。

编辑

我尝试了 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);
}
}

它运行时没有错误,但它对复选框没有任何作用,所以我不确定问题出在哪里。非常感谢任何帮助。

最佳答案

好的,对于多项选择,您需要模型、适配器。所以您必须制作自定义 ListView 。我在下面给出了一个示例。您只需将 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;
}
}

而Activity应该是这样的-->

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);
}
}
}

从我的角度来看,如果不让我知道,这可能是解决方案。

关于android - 如何突出显示或检查选定的列表项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41426759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com