Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/211.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 单击时,Listview会选择多个项目_Java_Android_Listview_Android Listview - Fatal编程技术网

Java 单击时,Listview会选择多个项目

Java 单击时,Listview会选择多个项目,java,android,listview,android-listview,Java,Android,Listview,Android Listview,我想成为一名任务经理,但我只有一个问题。我有一个膨胀的列表视图。listview中的所有元素都是正确的。问题是,当我选择一个项目时,listview会选择另一个项目。我听说ListView会在列表向下滚动时重新填充列表以节省内存。我认为这可能是某种问题。这是一张照片。 如果我加载了更多的应用程序,那么它将继续一次选择多个 下面是我的适配器、活动和相关XML的代码 public class TaskAdapter extends BaseAdapter{ private Context mCont

我想成为一名任务经理,但我只有一个问题。我有一个膨胀的列表视图。listview中的所有元素都是正确的。问题是,当我选择一个项目时,listview会选择另一个项目。我听说ListView会在列表向下滚动时重新填充列表以节省内存。我认为这可能是某种问题。这是一张照片。 如果我加载了更多的应用程序,那么它将继续一次选择多个

下面是我的适配器、活动和相关XML的代码

public class TaskAdapter extends BaseAdapter{
private Context mContext;
private List<TaskInfo> mListAppInfo;
private PackageManager mPack;


public TaskAdapter(Context c, List<TaskInfo> list, PackageManager pack) {
    mContext = c;
    mListAppInfo = list;
    mPack = pack;
}

@Override
public int getCount() {
    return mListAppInfo.size();
}

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

@Override
public long getItemId(int position) {
    return position;
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    TaskInfo entry = mListAppInfo.get(position);


    if (convertView == null)
    {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        //System.out.println("Setting LayoutInflater in TaskAdapter " +mContext +" " +R.layout.taskinfo +" " +R.id.tmbox);
        convertView = inflater.inflate(R.layout.taskinfo,null);
    }

        ImageView ivIcon = (ImageView)convertView.findViewById(R.id.tmImage);
        ivIcon.setImageDrawable(entry.getIcon());

        TextView tvName = (TextView)convertView.findViewById(R.id.tmbox);
        tvName.setText(entry.getName());

        convertView.setOnClickListener(new OnClickListener()
        {
            @Override
            public void onClick(View v) {
                final CheckBox checkBox = (CheckBox)v.findViewById(R.id.tmbox);
                if(v.isSelected())
                {
                    System.out.println("Listview not selected ");
                    //CK.get(arg2).setChecked(false);
                    checkBox.setChecked(false);
                    v.setSelected(false);
                }
                else
                {
                    System.out.println("Listview selected ");
                    //CK.get(arg2).setChecked(true);
                    checkBox.setChecked(true);
                    v.setSelected(true);
                }

            }
        });

    return convertView;




public class TaskManager extends Activity implements Runnable
    {
private ProgressDialog pd;
private TextView ram;
private String s;

    @Override
    public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.taskpage);
        setTitleColor(Color.YELLOW);

        Thread thread = new Thread(this);
        thread.start();

    }
    @Override
    public void run() 
    {
        //System.out.println("In Taskmanager Run() Thread");
        final PackageManager pm = getPackageManager();
        final ListView box = (ListView) findViewById(R.id.cBoxSpace);
        final List<TaskInfo> CK = populate(box, pm);
        runOnUiThread(new Runnable()
        {
            @Override
            public void run()
            {
                ram.setText(s);
                box.setAdapter(new TaskAdapter(TaskManager.this, CK, pm));

                //System.out.println("In Taskmanager runnable Run()");    
                endChecked(CK);
            }
        });
                handler.sendEmptyMessage(0);
    }
公共类TaskAdapter扩展了BaseAdapter{
私有上下文;
私人名单;
专用包装管理器mPack;
公共任务适配器(上下文c、列表、PackageManager包){
mContext=c;
mListAppInfo=列表;
mPack=包装;
}
@凌驾
public int getCount(){
返回mListAppInfo.size();
}
@凌驾
公共对象getItem(int位置){
返回mlistapingfo.get(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
TaskInfo entry=mListAppInfo.get(位置);
if(convertView==null)
{
LayoutFlater充气机=LayoutFlater.from(mContext);
//System.out.println(“在TaskAdapter中设置LayoutFlater”+mContext+“”+R.layout.taskinfo+“”+R.id.tmbox);
convertView=充气机。充气(R.layout.taskinfo,null);
}
ImageView ivIcon=(ImageView)convertView.findViewById(R.id.tmImage);
setImageDrawable(entry.getIcon());
TextView tvName=(TextView)convertView.findViewById(R.id.tmbox);
tvName.setText(entry.getName());
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v){
最终复选框CheckBox=(复选框)v.findviewbyd(R.id.tmbox);
如果(v.isSelected())
{
System.out.println(“未选择Listview”);
//CK.get(arg2).setChecked(false);
checkBox.setChecked(false);
v、 已选择(假);
}
其他的
{
System.out.println(“选择Listview”);
//CK.get(arg2).setChecked(true);
checkBox.setChecked(true);
v、 已选择(正确);
}
}
});
返回视图;
公共类TaskManager扩展活动实现可运行
{
私营部门;
私有文本视图ram;
私有字符串;
@凌驾
创建时的公共void(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.taskpage);
设置颜色(颜色:黄色);
螺纹=新螺纹(此);
thread.start();
}
@凌驾
公开募捐
{
//System.out.println(“In Taskmanager Run()线程”);
最终PackageManager pm=getPackageManager();
最终ListView框=(ListView)findViewById(R.id.cBoxSpace);
最终列表CK=填充(框,pm);
runOnUiThread(新的Runnable()
{
@凌驾
公开募捐
{
ram.setText(s);
box.setAdapter(新任务适配器(TaskManager.this,CK,pm));
//System.out.println(“In Taskmanager runnable Run()”;
endChecked(CK);
}
});
handler.sendEmptyMessage(0);
}
Taskinfo.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal" 
android:gravity="center_horizontal">

<ImageView 
    android:id="@+id/tmImage"
    android:layout_width="48dp"
    android:layout_height="48dp"
    android:scaleType="centerCrop"
    android:adjustViewBounds="false"
    android:focusable="false" />
<CheckBox 
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" 
    android:id="@+id/tmbox"
    android:lines="2"/>
      </LinearLayout>

Taskpage.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:orientation="vertical">
    <ListView
        android:id="@+id/cBoxSpace"
        android:layout_width="wrap_content"
        android:layout_height="400dp"
        android:orientation="vertical"/>
<TextView
        android:id="@+id/RAM"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="18sp" />
<Button
        android:id="@+id/endButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="End Selected Tasks" />
</LinearLayout>


如果您想知道通过单击选择多个项目的原因,我们将不胜感激。我一直在使用不同的实现、侦听器和ListAdapter,但都无济于事。

我想关键是您只在视图中保存检查状态(v.setSelected)

您可以重用这些视图,因此其复选框始终不会更改其状态

可以创建状态数组来保存每个TaskInfo的每个检查状态,并在创建视图时检查此数组

比如说

// default is false
ArrayList<Boolean> checkingStates = new ArrayList<Boolean>(mListAppInfo.size());
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    TaskInfo entry = mListAppInfo.get(position);
    if (convertView == null)
    {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        convertView = inflater.inflate(R.layout.taskinfo,null);
    }

    ImageView ivIcon = (ImageView)convertView.findViewById(R.id.tmImage);
    ivIcon.setImageDrawable(entry.getIcon());

    TextView tvName = (TextView)convertView.findViewById(R.id.tmbox);
    tvName.setText(entry.getName());

    final CheckBox checkBox = (CheckBox)v.findViewById(R.id.tmbox);
    checkBox.setChecked(checkingStates.get(position));
    convertView.setSelected(checkingStates.get(position));

    convertView.setOnClickListener(new OnClickListener()
    {
        @Override
        public void onClick(View v) {
            if(v.isSelected())
            {
                System.out.println("Listview not selected ");
                //CK.get(arg2).setChecked(false);
                checkBox.setChecked(false);
                v.setSelected(false);
                checkingStates.get(position) = false;
            }
            else
            {
                System.out.println("Listview selected ");
                //CK.get(arg2).setChecked(true);
                checkBox.setChecked(true);
                v.setSelected(true);
                checkingStates.get(position) = true;
            }

        }
    });

return convertView;
}
//默认值为false
ArrayList checkingStates=新的ArrayList(mListAppInfo.size());
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
TaskInfo entry=mListAppInfo.get(位置);
if(convertView==null)
{
LayoutFlater充气机=LayoutFlater.from(mContext);
convertView=充气机。充气(R.layout.taskinfo,null);
}
ImageView ivIcon=(ImageView)convertView.findViewById(R.id.tmImage);
setImageDrawable(entry.getIcon());
TextView tvName=(TextView)convertView.findViewById(R.id.tmbox);
tvName.setText(entry.getName());
最终复选框CheckBox=(复选框)v.findviewbyd(R.id.tmbox);
checkBox.setChecked(checkingStates.get(position));
convertView.setSelected(checkingStates.get(position));
setOnClickListener(新的OnClickListener()
{
@凌驾
公共void onClick(视图v){
如果(v.isSelected())
{
System.out.println(“未选择Listview”);
//CK.get(arg2).setChecked(false);
checkBox.setChecked(false);
v、 已选择(假);
checkingStates.get(position)=false;
}
其他的
{
System.out.println(“选择Listview”);
//CK.get(arg2).setChecked(true);
checkBox.setChecked(true);
v、 已选择(正确);
checkingStates.get(position)=true;
}
}
});
返回视图;
}

我不能100%确定您想做什么,但您的部分问题可能与您的
onClick
方法中的条件有关:

if(v.isSelected())
我想你是想这样的
if(v.isChecked())
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    TaskInfo entry = mListAppInfo.get(position);

    if (convertView == null)
    {
        LayoutInflater inflater = LayoutInflater.from(mContext);
        //System.out.println("Setting LayoutInflater in TaskAdapter " +mContext +" " +R.layout.taskinfo +" " +R.id.tmbox);
        convertView = inflater.inflate(R.layout.taskinfo,null);
    }

    ImageView ivIcon = (ImageView)convertView.findViewById(R.id.tmImage);
    ivIcon.setImageDrawable(entry.getIcon());

    TextView tvName = (TextView)convertView.findViewById(R.id.tmbox);
    tvName.setText(entry.getName());

    CheckBox checkBox = (CheckBox)v.findViewById(R.id.tmbox);
    checkBox.setChecked(entry.isChecked());
}
listView.setOnItemClickListener(new OnItemClickListener() {
    public void onItemClick(AdapterView parent, View v, int position, long id) {
        entry = mListAppInfo.get(position);
        entry.setChecked(!entry.isChecked());
    }
});
package com.app.adapter;



public class CategoryDynamicAdapter {

    public static ArrayList<CategoryBean> categoryList = new ArrayList<CategoryBean>();

    Context context;
    Typeface typeface;
    public static String videoUrl = "" ;    
    Handler handler;
    Runnable runnable;


      // constructor
      public CategoryDynamicAdapter(Activity a, Context context, Bitmap [] imagelist,ArrayList<CategoryBean> list) {

        this.context    = context;
        this.categoryList       = list;
        this.a = a;


    }

     // Baseadapter to the set the data response from web service into listview.
     public BaseAdapter mEventAdapter  = new BaseAdapter() {



        @Override
        public int getCount() {
            return categoryList.size();
        }

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

        @Override
        public long getItemId(int position) {
            return 0;
        }

        class ViewHolder {
            TextView    title,category,uploadedBy;
            ImageView   image;
            RatingBar video_rating;
            Button  report_video ,Flag_video;
        }

        public View getView(final int position, View convertView, final ViewGroup parent) {
            ViewHolder  vh = null ;

                if(convertView  ==  null) {

                vh                    =         new                                                          ViewHolder();  
                convertView           =         LayoutInflater.from(context).inflate (R .layout.custom_category_list_layout,null,false);
                vh.title              =         (TextView)                convertView                .findViewById        (R.id.title);
                vh.image = (ImageView)          convertView.findViewById(R.id.Imagefield);

                convertView.setTag(vh);
            }
            else 
            {
                vh=(ViewHolder) convertView.getTag();
            }   

            try
            {
                final CategoryBean Cb = categoryList.get(position);


//pay attention to code below this line i have shown here how to select a listview using arraylist getter setter objects 

                String checkedStatus   =   Cb.getCheckedStringStaus();
            if(checkdStatus.equal("0")
              { 
                   System.out.println("Listview not selected ");
                    //CK.get(arg2).setChecked(false);
                    checkBox.setChecked(false);
                    v.setSelected(false);
              }
                else             ////checkdStatus.equal("1")
                {
                    System.out.println("Listview selected ");
                    //CK.get(arg2).setChecked(true);
                    checkBox.setChecked(true);
                    v.setSelected(true);
                }

            catch (Exception e) 
            {
                e.printStackTrace();
            }