Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/230.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 调用onItemClick()时,为什么要为ListVIew中显示的每一行再次调用getView()?_Java_Android - Fatal编程技术网

Java 调用onItemClick()时,为什么要为ListVIew中显示的每一行再次调用getView()?

Java 调用onItemClick()时,为什么要为ListVIew中显示的每一行再次调用getView()?,java,android,Java,Android,为什么每次使用自定义适配器在ListView上调用onItemClick()事件时,都会再次调用适配器中的getView()方法 我在API级别7中有以下代码,当我尝试更改行的CheckedTextView对象(存储在a中)中的选中值时,会调用每行的适配器的getView(),我得到一个奇怪的行为(listView中的选定行选中/取消选中另一行中的CheckedTextView): 该活动的代码为: public class EnvioImagenesActivity extends Activ

为什么每次使用自定义适配器在ListView上调用onItemClick()事件时,都会再次调用适配器中的getView()方法

我在API级别7中有以下代码,当我尝试更改行的CheckedTextView对象(存储在a中)中的选中值时,会调用每行的适配器的getView(),我得到一个奇怪的行为(listView中的选定行选中/取消选中另一行中的CheckedTextView):

该活动的代码为:

public class EnvioImagenesActivity extends Activity implements OnItemClickListener {

    ListView listView;
    private EnvioImagenAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.envio_imagenes);
        listView=(ListView) findViewById(R.id.listViewEnvios);
        adapter=new EnvioImagenAdapter(this,Store.getImages());
        listView.setAdapter(adapter);
        listView.setOnItemClickListener(this);
    }

    public void onItemClick(AdapterView<?> arg0, View view, int pos,
            long id) {
        ViewHolder holder=(ViewHolder) view.getTag();
        holder.checkedTextView.toggle();
    }


}
对于列表中显示的每一行


提前感谢

我注意到,从getView()外部访问视图很少会产生预期的行为。我想这是因为回收机制。有两个备选方案可行:

1) 在
getView()中实现
onClick()


2) 如果要将逻辑排除在适配器之外,请在
onItemClick()
中,更改基础数据并调用
adapter.notifyDatasetChanged()
。复选框将切换。

我在代码中遇到了类似的问题

ListView.setChoiceMode (ListView.CHOICE_MODE_SINGLE);
在您的情况下,当您再次为调用的每个项目单击该项目时,您可以尝试删除
android:choiceMode=“multipleechoice”

也许这对你有帮助

    public class EnvioImagenAdapter extends BaseAdapter {

        private List<ImageUri> items;
        private Context context;

        public EnvioImagenAdapter(Context context, List<ImageUri> items) {
            this.context=context;
            this.items = items;
        }

        public int getCount() {
            return items.size();
        }

        public Object getItem(int position) {
            return items.get(position);
        }

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

        public View getView(int position, View convertView, ViewGroup parent) {
            System.out.println("---getView() method called");
            View v = convertView;
            ViewHolder holder;
            if (v == null) {
                LayoutInflater vi = (LayoutInflater) context
                        .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.row_envio_imagen, null);
                holder = new ViewHolder();
                holder.imageView = (ImageView) v.findViewById(R.id.imageView1);
                holder.textView = (TextView) v.findViewById(R.id.textView1);
                holder.temporalProgressBar = (ProgressBar) v
                        .findViewById(R.id.progressBar1);
                holder.checkedTextView = (CheckedTextView) v
                        .findViewById(R.id.checkedTextView12);
                holder.selected = true;
                holder.position = position;
                v.setTag(holder);
            } else {
                holder = (ViewHolder) v.getTag();
            }
            ImageUri imageUri = items.get(position);
            File f = new File(imageUri.getImageUri().getPath());
            String fileSize = Util.formatFileSize(f.length());
            holder.textView.setText(fileSize);
            new ImageTask(imageUri).execute(holder);
            return v;
        }

        class ImageTask extends AsyncTask<ViewHolder, Void, Bitmap> {

            public ImageTask(ImageUri imageUri) {
                this.imageUri = imageUri;
            }

            private ImageUri imageUri;
            private ViewHolder viewHolder;

            @Override
            protected Bitmap doInBackground(ViewHolder... params) {
                viewHolder = params[0];
                Bitmap bmp = BitmapFactory.decodeFile(imageUri.getThumbUri()
                        .getPath());
                return bmp;
            }

            protected void onPostExecute(Bitmap result) {
                super.onPostExecute(result);
                viewHolder.temporalProgressBar.setVisibility(View.GONE);
                viewHolder.imageView.setVisibility(View.VISIBLE);
                viewHolder.imageView.setImageBitmap(result);
            };

        }

        class ViewHolder {
            public int position;
            CheckedTextView checkedTextView;
            ProgressBar temporalProgressBar;
            ImageView imageView;
            TextView textView;
            boolean selected;
        }

    }
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:padding="6dip" >

    <ProgressBar
        android:id="@+id/progressBar1"
        android:layout_width="45dip"
        android:layout_height="45dip"
        android:layout_alignParentLeft="true" />

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="45dip"
        android:layout_height="45dip"
        android:layout_alignParentLeft="true" />

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:paddingLeft="5dip"
        android:layout_toRightOf="@id/imageView1" />

    <CheckedTextView
        android:id="@+id/checkedTextView12"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:checkMark="?android:attr/textCheckMark"
        android:checked="true" 
        android:layout_alignParentRight="true">
    </CheckedTextView>


    <ProgressBar
        android:id="@+id/progressBar2"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_height="wrap_content"
        android:layout_width="0dip"
        android:layout_below="@+id/textView1"
        android:layout_toLeftOf="@id/checkedTextView12"
        android:layout_toRightOf="@id/imageView1"
        android:paddingLeft="5dip"
        android:paddingTop="2dip" />


</RelativeLayout>
System.out(2947): ---getView() method called
ListView.setChoiceMode (ListView.CHOICE_MODE_SINGLE);