Android 滚动时取消选择的ListView项目
我遇到的问题是,当我开始滚动选择的项目时,它们被取消选择,我看到了其他一些关于这方面的帖子,其中一些据说被放入了一个数组中,但我尝试了一些,但似乎没有起作用 我的代码:Android 滚动时取消选择的ListView项目,android,listview,scroll,Android,Listview,Scroll,我遇到的问题是,当我开始滚动选择的项目时,它们被取消选择,我看到了其他一些关于这方面的帖子,其中一些据说被放入了一个数组中,但我尝试了一些,但似乎没有起作用 我的代码: public class ListAdapter extends BaseAdapter { Context ctx; LayoutInflater lInflater; ArrayList<Product> objects; ListAdapter(Context context, ArrayList<P
public class ListAdapter extends BaseAdapter {
Context ctx;
LayoutInflater lInflater;
ArrayList<Product> objects;
ListAdapter(Context context, ArrayList<Product> products) {
ctx = context;
objects = products;
lInflater = (LayoutInflater) ctx
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return objects.size();
}
@Override
public Object getItem(int position) {
return objects.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}
final Product p = getProduct(position);
((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
SharedPreferences settings = ctx.getSharedPreferences("data",ctx.MODE_PRIVATE);
boolean Checked = settings.getBoolean(p.name, false);
cbBuy.setChecked(Checked);
cbBuy.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
if(cbBuy.isChecked()==true){
SharedPreferences settings = ctx.getSharedPreferences("data",Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, true).commit();
Toast.makeText(ctx, "You Selected" + p.name, Toast.LENGTH_SHORT).show();
}else{
SharedPreferences settings = ctx.getSharedPreferences("data", Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, false).commit();
Toast.makeText(ctx, "You Deselected" +p.name, Toast.LENGTH_SHORT).show();
}
}
});{
return view;
}
}
Product getProduct(int position) {
return ((Product) getItem(position));
}
ArrayList<Product> getBox() {
ArrayList<Product> box = new ArrayList<Product>();
for (Product p : objects) {
if (p.box)
box.add(p);
}
return box;
}
OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
getProduct((Integer) buttonView.getTag()).box = isChecked;
}
};
}
主要活动
public class MainActivity extends AppCompatActivity {
ArrayList<Product> products = new ArrayList<Product>();
ListAdapter boxAdapter;
private SharedPreferences mPrefs;
private String mData;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main2);
fillData();
boxAdapter = new ListAdapter(this, products);
ListView lvMain = (ListView) findViewById(R.id.lvMain);
lvMain.setAdapter(boxAdapter);
}
void fillData() {
products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
products.add(new Product("Al", "5230%", R.drawable.ic_launcher, false));
products.add(new Product("Alf", "5230%", R.drawable.ic_launcher, false));
products.add(new Product("Alfa", "5230%", R.drawable.ic_launcher, false));
products.add(new Product("Alfae", "5120%", R.drawable.ic_launcher, false));
products.add(new Product("Alfsdfsdfakher", "50435%", R.drawable.ic_launcher, false));
products.add(new Product("Alfasdfsdfkher", "5123120%", R.drawable.ic_launcher, false));
products.add(new Product("Alfasdfsdfkher", "501231%", R.drawable.ic_launcher, false));
products.add(new Product("Alfaksdfsdfher", "11250%", R.drawable.ic_launcher, false));
/*for (int i = 1; i <= 20; i++) {
products.add(new Product("Product " + i, i * 100,
R.drawable.ic_launcher, false));
}*/
}
/*public void showResult(View v) {
String result = "Selected Product are :";
int totalAmount=0;
for (Product p : boxAdapter.getBox()) {
if (p.box){
result += "\n" + p.name;
totalAmount+=p.price;
}
}
Toast.makeText(this, result+"\n"+"Total Amount:="+totalAmount, Toast.LENGTH_LONG).show();
}*/
}
您可以在模型类中管理一个变量 像这样
public class Product
{
private boolean isSelected=false;
//Make ur getter and settter
}
适配器类
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}
final Product p = getProduct(position);
((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
SharedPreferences settings = ctx.getSharedPreferences("data",ctx.MODE_PRIVATE);
boolean Checked = settings.getBoolean(p.name, false);
cbBuy.setChecked(Checked);
//use click listener instead of checked change
cbBuy.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(objects.get(position).isSelected)
{
cbBuy.setChecked(false);
objects.get(position).setSelected(false);
//Save into sharepref here
SharedPreferences settings = ctx.getSharedPreferences("data",Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, false).commit();
Toast.makeText(ctx, "You Selected" + p.name, Toast.LENGTH_SHORT).show();
}
else
{
cbBuy.setChecked(true);
objects.get(position).setSelected(true);
//Save into sharepref here
SharedPreferences settings = ctx.getSharedPreferences("data",Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, true).commit();
Toast.makeText(ctx, "You Selected" + p.name, Toast.LENGTH_SHORT).show();
}
}
});
//For scrolling issue use this
if(objects.get(position).isSelected)
{
cbBuy.setChecked(true);
}
else
{
cbBuy.setChecked(false);
}
return view;
}
}
希望这能帮助你……如果你有任何问题可以问你应该使用ListView holder模式。类似于:在我的product类中,我已经有一个名为box的布尔值,我已经添加了上面的代码,以显示它在product类中的状态。另外,setselected将出现,因为无法解析方法setselected请提供任何帮助?private boolean isSelected=false;请你解释一下如何做这个,我不知道这是怎么做的?
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.item, parent, false);
}
final Product p = getProduct(position);
((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
final CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
SharedPreferences settings = ctx.getSharedPreferences("data",ctx.MODE_PRIVATE);
boolean Checked = settings.getBoolean(p.name, false);
cbBuy.setChecked(Checked);
//use click listener instead of checked change
cbBuy.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
if(objects.get(position).isSelected)
{
cbBuy.setChecked(false);
objects.get(position).setSelected(false);
//Save into sharepref here
SharedPreferences settings = ctx.getSharedPreferences("data",Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, false).commit();
Toast.makeText(ctx, "You Selected" + p.name, Toast.LENGTH_SHORT).show();
}
else
{
cbBuy.setChecked(true);
objects.get(position).setSelected(true);
//Save into sharepref here
SharedPreferences settings = ctx.getSharedPreferences("data",Context.MODE_PRIVATE);
settings.edit().putBoolean(p.name, true).commit();
Toast.makeText(ctx, "You Selected" + p.name, Toast.LENGTH_SHORT).show();
}
}
});
//For scrolling issue use this
if(objects.get(position).isSelected)
{
cbBuy.setChecked(true);
}
else
{
cbBuy.setChecked(false);
}
return view;
}
}