[英]Checkbox geting unchecked after scrolling Custom listview…!
I Create custom listview, and put checkbox in it. 我创建自定义列表视图,并在其中添加复选框。
at First I check all checkbox and then I scroll down listview, then checkbox getting Unchecked. 首先,我选中所有复选框,然后向下滚动列表视图,然后选中“未选中”复选框。
what should I do? 我该怎么办?
CustomListItem.java CustomListItem.java
package com.example.customlistviewdemo;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
public class CustomListItem extends ArrayAdapter<String> {
private final Activity context;
private final String[] TitleArray;
private final String[] SubTitlearray;
private final String[] TimeArray;
private final Integer[] MainImageId;
public CustomListItem(Activity context, String[] TitleArray,
String[] SubTitlearray, String[] TimeArray, Integer[] MainImageId) {
super(context, R.layout.list_item, TitleArray);
this.context = context;
this.TitleArray = TitleArray;
this.SubTitlearray = SubTitlearray;
this.TimeArray = TimeArray;
this.MainImageId = MainImageId;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
LayoutInflater inflater = context.getLayoutInflater();
View rowView = inflater.inflate(R.layout.list_item, null, true);
ImageView animal, car, environment, map1, warning1, map2, warning2, download, share, plant;
animal = (ImageView) rowView.findViewById(R.id.imgAnimal);
car = (ImageView) rowView.findViewById(R.id.imgCar);
environment = (ImageView) rowView.findViewById(R.id.imgEnvironment);
plant = (ImageView) rowView.findViewById(R.id.imgPlant);
map1 = (ImageView) rowView.findViewById(R.id.imgMap);
warning1 = (ImageView) rowView.findViewById(R.id.imgWarning);
map2 = (ImageView) rowView.findViewById(R.id.imgMap2);
warning2 = (ImageView) rowView.findViewById(R.id.imgWarining2);
download = (ImageView) rowView.findViewById(R.id.imgDownload);
CheckBox chk = (CheckBox) rowView.findViewById(R.id.checkbox);
share = (ImageView) rowView.findViewById(R.id.imgShare);
animal.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "Animal ImageView is Clicked",
5000).show();
// TODO Auto-generated method stub
}
});
car.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(), "Cars ImageView is Clicked", 5000)
.show();
// TODO Auto-generated method stub
}
});
environment.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(getContext(),
"environment ImageView is Clicked", 5000).show();
// TODO Auto-generated method stub
}
});
------------------------------------------------------------------
...........................SO on............................
..........................................................
TextView mainTitle = (TextView) rowView.findViewById(R.id.txtMainTitle);
ImageView mainImage = (ImageView) rowView
.findViewById(R.id.imgMainImage);
TextView SubText = (TextView) rowView.findViewById(R.id.txtSubTitle);
TextView TimeText = (TextView) rowView.findViewById(R.id.txtTimeTitle);
mainTitle.setText(TitleArray[position]);
SubText.setText(SubTitlearray[position]);
TimeText.setText(TimeArray[position]);
mainImage.setImageResource(MainImageId[position]);
return rowView;
}
}
ActivityMain.java ActivityMain.java
package com.example.customlistviewdemo;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
public class MainActivity extends Activity {
ListView list;
String[] TitleArray = { "Testing Title1. This is MainTitle",
"Testing Title2. This is MainTitle",
"Testing Title3. This is MainTitle",
"Testing Title4. This is MainTitle",
"Testing Title5. This is MainTitle",
"Testing Title6. This is MainTitle" };
String[] SubTitleArray = { "Reported by Man 1", "Reported by Man 2",
"Reported by Man 3", "Reported by Man 4", "Reported by Man 5",
"Reported by Man 6" };
String[] TimeArray = { "about 1 hour ago", "about 2 hour ago",
"about 3 hour ago", "about 4 hour ago", "about 5 hour ago",
"about 6 hour ago" };
Integer[] MainImageId = { R.drawable.android1, R.drawable.android2,
R.drawable.android3, R.drawable.android4, R.drawable.android5,
R.drawable.android6 };
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
CustomListItem adapter = new CustomListItem(MainActivity.this,
TitleArray, SubTitleArray, TimeArray, MainImageId);
list = (ListView) findViewById(R.id.listView1);
list.setAdapter(adapter);
}
}
list_item.xml list_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="#FFF"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="10dp" >
<TextView
android:id="@+id/txtMainTitle"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="This is Sample Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="130dp" >
<LinearLayout
android:layout_width="150dp"
android:layout_height="wrap_content"
android:paddingRight="15dp" >
<CheckBox
android:layout_width="wrap_content"
android:layout_height="fill_parent" />
<ImageView
android:id="@+id/imgMainImage"
android:layout_width="100dp"
android:layout_height="fill_parent" />
</LinearLayout>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/txtSubTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="5dp"
android:text="This is Sample Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="16dp" />
<TextView
android:id="@+id/txtTimeTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="This is Sample Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:textSize="12dp" />
<HorizontalScrollView
android:id="@+id/scrollView1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="8dp"
android:layout_marginTop="8dp" >
<ImageView
android:id="@+id/imgAnimal"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_animal" />
<ImageView
android:id="@+id/imgCar"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_car" />
<ImageView
android:id="@+id/imgEnvironment"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_environment" />
<ImageView
android:id="@+id/imgPlant"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/channel_plant" />
<ImageView
android:id="@+id/imgMap"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/tab_icon_map" />
<ImageView
android:id="@+id/imgWarning"
android:layout_width="25dp"
android:layout_height="25dp"
android:layout_marginRight="10dp"
android:src="@drawable/warning_icon" />
</LinearLayout>
</HorizontalScrollView>
<HorizontalScrollView
android:id="@+id/scrollView2"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:scrollbars="none" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<ImageView
android:id="@+id/imgMap2"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/tab_icon_map" />
<ImageView
android:id="@+id/imgWarining2"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/warning_icon" />
<ImageView
android:id="@+id/imgDownload"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/download_icon" />
<ImageView
android:id="@+id/imgShare"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_marginRight="10dp"
android:src="@drawable/share_icon" />
</LinearLayout>
</HorizontalScrollView>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<View
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="1dp"
android:layout_toRightOf="@+id/text1"
android:background="#FF9900" />
</LinearLayout>
</LinearLayout>
Just Modify your adapter class like this architecture i hope it works : the important lines are setting the tag and getting the tag. 我希望像这样的体系结构那样修改您的适配器类,我希望它能起作用:重要的几行是设置标签和获取标签。
public class MyAdapter extends ArrayAdapter<Model> {
private final List<Model> list;
private final Activity context;
boolean checkAll_flag = false;
boolean checkItem_flag = false;
public MyAdapter(Activity context, List<Model> list) {
super(context, R.layout.row, list);
this.context = context;
this.list = list;
}
static class ViewHolder {
protected TextView text;
protected CheckBox checkbox;
}
@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.row, null);
viewHolder = new ViewHolder();
viewHolder.text = (TextView) convertView.findViewById(R.id.label);
viewHolder.checkbox = (CheckBox) convertView
.findViewById(R.id.check);
viewHolder.checkbox
.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.
list.get(getPosition).setSelected(
buttonView.isChecked()); // Set the value of
// checkbox to
// maintain its
// state.
}
});
convertView.setTag(viewHolder);
convertView.setTag(R.id.label, viewHolder.text);
convertView.setTag(R.id.check, viewHolder.checkbox);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.checkbox.setTag(position); // This line is important.
viewHolder.text.setText(list.get(position).getName());
viewHolder.checkbox.setChecked(list.get(position).isSelected());
return convertView;
}
}
There is an issue with ListView
when you are using CheckBox
within ListView
is that the Checked state
of CheckBox
will not maintain by Android
because when you Scroll ListView
it will generate new View
for each row using getView()
method and Garbage Collector
will remove all above View
to make space so CheckBox
state will also destroy or garbage by Garbage Collector
. 当您在
ListView
中使用CheckBox
时, ListView
存在一个问题,即Android
无法维护CheckBox
的Checked state
,因为当您Scroll ListView
,它将使用getView()
方法为每一行生成新的View
,并且Garbage Collector
将删除所有上面的内容View
以腾出空间,以便CheckBox
状态也将被Garbage Collector
破坏或Garbage Collector
。 You can solve this by following sample: 您可以通过以下示例解决此问题:
Main.xml main.xml中
<relativelayout
android:layout_height="match_parent"
android:layout_width="match_parent"
tools:context=".Main"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<listview
android:divider="#000"
android:dividerheight="0.8dp"
android:id="@+id/listView1"
android:layout_alignparentleft="true"
android:layout_alignparenttop="true"
android:layout_height="match_parent"
android:layout_width="match_parent">
</listview>
<button
android:id="@+id/button1"
android:layout_alignparenttop="true"
android:layout_centerhorizontal="true"
android:layout_height="wrap_content"
android:layout_width="match_parent"
android:text="Check Selected">
</button>
</relativelayout>
list_item.xml list_item.xml
<relativelayout
android:layout_height="match_parent"
android:layout_width="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android">
<textview
android:id="@+id/textView1"
android:layout_alignparentleft="true"
android:layout_alignparenttop="true"
android:layout_height="wrap_content"
android:layout_marginbottom="10dp"
android:layout_margintop="10dp"
android:layout_width="wrap_content"
android:text="Medium Text"
android:textappearance="?android:attr/textAppearanceMedium">
</textview>
<checkbox
android:focusable="false"
android:focusableintouchmode="false"
android:id="@+id/checkBox1"
android:layout_alignbaseline="@+id/textView1"
android:layout_alignbottom="@+id/textView1"
android:layout_alignparentright="true"
android:layout_height="wrap_content"
android:layout_marginright="16dp"
android:layout_width="wrap_content">
</checkbox>
</relativelayout>
Main.java Main.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import android.app.Activity;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class Main extends Activity implements OnItemClickListener{
ListView apps;
PackageManager packageManager;
ArrayList <String> checkedValue;
Button bt1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bt1 = (Button) findViewById(R.id.button1);
apps = (ListView) findViewById(R.id.listView1);
packageManager = getPackageManager();
final List <PackageInfo> packageList = packageManager
.getInstalledPackages(PackageManager.GET_META_DATA); // all apps in the phone
final List <PackageInfo> packageList1 = packageManager
.getInstalledPackages(0);
try {
packageList1.clear();
for (int n = 0; n < packageList.size(); n++)
{
PackageInfo PackInfo = packageList.get(n);
if (((PackInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0) != true)
//check weather it is system app or user installed app
{
try
{
packageList1.add(packageList.get(n)); // add in 2nd list if it is user installed app
Collections.sort(packageList1,new Comparator <PackageInfo>()
// this will sort App list on the basis of app name
{
public int compare(PackageInfo o1,PackageInfo o2)
{
return o1.applicationInfo.loadLabel(getPackageManager()).toString()
.compareToIgnoreCase(o2.applicationInfo.loadLabel(getPackageManager())
.toString());// compare and return sorted packagelist.
}
});
} catch (NullPointerException e) {
e.printStackTrace();
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
Listadapter Adapter = new Listadapter(this,packageList1, packageManager);
apps.setAdapter(Adapter);
apps.setOnItemClickListener(this);
bt1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Toast.makeText(Main.this,"" + checkedValue,Toast.LENGTH_LONG).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onItemClick(AdapterView arg0, View v, int position, long arg3) {
// TODO Auto-generated method stub
CheckBox cb = (CheckBox) v.findViewById(R.id.checkBox1);
TextView tv = (TextView) v.findViewById(R.id.textView1);
cb.performClick();
if (cb.isChecked()) {
checkedValue.add(tv.getText().toString());
} else if (!cb.isChecked()) {
checkedValue.remove(tv.getText().toString());
}
}
}
Listadapter.java Listadapter.java
import java.util.List;
import android.app.Activity;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.TextView;
public class Listadapter extends BaseAdapter{
List <PackageInfo> packageList;
Activity context;
PackageManager packageManager;
boolean[] itemChecked;
public Listadapter(Activity context, List <PackageInfo> packageList,
PackageManager packageManager) {
super();
this.context = context;
this.packageList = packageList;
this.packageManager = packageManager;
itemChecked = new boolean[packageList.size()];
}
private class ViewHolder {
TextView apkName;
CheckBox ck1;
}
public int getCount() {
return packageList.size();
}
public Object getItem(int position) {
return packageList.get(position);
}
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
LayoutInflater inflater = context.getLayoutInflater();
if (convertView == null) {
convertView = inflater.inflate(R.layout.list_item, null);
holder = new ViewHolder();
holder.apkName = (TextView) convertView
.findViewById(R.id.textView1);
holder.ck1 = (CheckBox) convertView
.findViewById(R.id.checkBox1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
PackageInfo packageInfo = (PackageInfo) getItem(position);
Drawable appIcon = packageManager
.getApplicationIcon(packageInfo.applicationInfo);
String appName = packageManager.getApplicationLabel(
packageInfo.applicationInfo).toString();
appIcon.setBounds(0, 0, 40, 40);
holder.apkName.setCompoundDrawables(appIcon, null, null, null);
holder.apkName.setCompoundDrawablePadding(15);
holder.apkName.setText(appName);
holder.ck1.setChecked(false);
if (itemChecked[position])
holder.ck1.setChecked(true);
else
holder.ck1.setChecked(false);
holder.ck1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if (holder.ck1.isChecked())
itemChecked[position] = true;
else
itemChecked[position] = false;
}
});
return convertView;
}
}
Why you don't use setOnCheckedChangeListener()
to keep/hold the checked state for each position item? 为什么不使用
setOnCheckedChangeListener()
来保持/保持每个头寸项目的检查状态?
Remember to place setChecked()
after setOnCheckedChangeListener()
, otherwise it will trigger the previous ViewHolder object's setOnCheckedChangeListener()
which causes the unchecked problem for the previous item. 切记将
setChecked()
setOnCheckedChangeListener()
,否则将触发先前的ViewHolder对象的setOnCheckedChangeListener()
,从而导致上一项未选中的问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.