我知道这个问题一再被问到,但我仍然无法找到有用的建议。滚动列表视图时,复选框未选中。我正在使用Array List来存储特定项目时列表视图中所选项目的ID 未选中它将从列表视图中删除。
public class ManagePracticeLogAdapter extends BaseAdapter
{
Context context;
LayoutInflater inflater;
MenuItem menu,addlog;
List<Integer> SelectedBox;
ArrayList<HashMap<String, String>> data;
HashMap<String, String> resultp = new HashMap<String, String>();
public ManagePracticeLogAdapter(
Context context,
ArrayList<HashMap<String, String>> arraylist,
MenuItem mymenu,
MenuItem myaddlog)
{
this.context = context;
data = arraylist;
menu=mymenu;
addlog=myaddlog;
}
@Override
public int getCount()
{
return data.size();
}
@Override
public Object getItem(int position)
{
return null;
}
@Override
public long getItemId(int position)
{
return 0;
}
// Method to display data of Produce log Activity in list view
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
// TODO Auto-generated method stub
TextView datetime;
TextView totminutes;
TextView skills;
TextView weather;
final CheckBox chkdelete;
inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View itemView = inflater.inflate(R.layout.logitem1, parent, false);
// Get the position
resultp = data.get(position);
// Locate the TextViews in listview_item.xml
datetime = (TextView) itemView.findViewById(R.id.id_datetime);
totminutes = (TextView) itemView.findViewById(R.id.totminutes);
skills= (TextView) itemView.findViewById(R.id.id_skills);
weather=(TextView)itemView.findViewById(R.id.id_weather);
chkdelete=(CheckBox)itemView.findViewById(R.id.id_chkDelete);
// Capture position and set results to the TextViews
datetime.setText(resultp.get("Skill_practice"));
totminutes.setText(resultp.get("Day_minutes")+" min");
skills.setText(resultp.get("Night_minutes"));
weather.setText(resultp.get("Prac_Date"));
String fontPath = "fonts/Roboto-Light.ttf";
Typeface tf = Typeface.createFromAsset(context.getAssets(), fontPath);
datetime.setTypeface(tf);
totminutes.setTypeface(tf);
skills.setTypeface(tf);
weather.setTypeface(tf);
SelectedBox = new ArrayList<Integer>();
chkdelete.setOnCheckedChangeListener(new OnCheckedChangeListener()
{
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
if(SelectedBox.size()-1==0)
{
menu.setVisible(false);
addlog.setVisible(true);
}else
{
addlog.setVisible(false);
}
if(isChecked)
{
SelectedBox.add(buttonView.getId());
menu.setVisible(true);
addlog.setVisible(false);
}else if(!isChecked)
{
SelectedBox.remove(SelectedBox.indexOf(buttonView.getId()));
}
}
});
menu.setOnMenuItemClickListener(new OnMenuItemClickListener()
{
@Override
public boolean onMenuItemClick(MenuItem item)
{
// TODO Auto-generated method stub
if(!SelectedBox.isEmpty())
{
Toast.makeText(context, "Menu option 4 added!",
Toast.LENGTH_LONG).show();
}
return false;
}
});
itemView.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View arg0)
{
Intent intent = new Intent(context,LogEdit.class);
intent.putExtra("s11","Update Practice");
context.startActivity(intent);
}
});
return itemView;
}
}
答案 0 :(得分:2)
你的getView方法看起来应该是这样的
创建ViewHolder类
static class ViewHolder {
TextView datetime;
TextView totminutes;
TextView skills;
TextView weather;
CheckBox chkdelete;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder viewHolder = null;
if (convertView == null) {
LayoutInflater inflator = context.getLayoutInflater();
convertView = inflator.inflate(R.layout.logitem1, null);
viewHolder = new ViewHolder();
viewHolder.datetime = (TextView) convertView.findViewById(R.id.id_datetime);
// do the same thing for other textviews and checkbox.
viewHolder.chkdelete.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
int getPosition = (Integer) buttonView.getTag(); // Here we get the position that we have set for the checkbox using setTag.
}
});
convertView.setTag(viewHolder);
convertView.setTag(R.id.id_datetime, viewHolder.datetime);
// do the same for other textviews and checkbox
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.chkdelete.setTag(position); // This line is important.
viewHolder.datetime.setText(resultp.get("Skill_practice"));
// do the same for others
return convertView;
}
您需要根据需要进行修改。此代码将解决滚动问题。
答案 1 :(得分:0)
您需要使用例如稀疏布尔数组。 https://groups.google.com/forum/?fromgroups#!topic/android-developers/No0LrgJ6q2M
Listview被回收,所以你基本上需要在某个地方保存你的复选框的状态。
Juste创建一个大小为[复选框数]的稀疏布尔数组。
单击其中一个复选框后,获取其位置并在稀疏布尔数组中将元素(在此位置)设置为true。
在创建视图中,如果稀疏布尔值为真,则将复选框设置为“启用”状态。
您应该使用视图持有者,而不是每次都创建新对象。
祝你好运!答案 2 :(得分:0)
中的
buttonView
onCheckedChanged(CompoundButton buttonView, boolean isChecked)
指的是适配器的最后一项。这是因为适配器用于回收视图。要访问ID,请将其存储在标记中。
chkdelete.setTag(R.id.id_chkDelete);
最后,您可以通过onCheckedChanged()
内的标记
int checkBoxId=(int) view.getTag().toString();
最后,您的代码看起来像
SelectedBox = new ArrayList<Integer>();
chkdelete.setTag(R.id.id_chkDelete);
chkdelete.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked)
{
int checkBoxId=(int) view.getTag().toString();
if(SelectedBox.size()-1==0)
{
menu.setVisible(false);
addlog.setVisible(true);
}else
{
addlog.setVisible(false);
}
if(isChecked)
{
SelectedBox.add(checkBoxId);
menu.setVisible(true);
addlog.setVisible(false);
}else if(!isChecked)
{
SelectedBox.remove(SelectedBox.indexOf(checkBoxId));
}
}
});