Java 为什么不是';是否异步停止重新创建listview?

Java 为什么不是';是否异步停止重新创建listview?,java,android,listview,android-asynctask,Java,Android,Listview,Android Asynctask,我真的不知道怎么问这个但是 我的代码旨在通过单击按钮生成ListView输入 当我单击按钮时,它应该.execute()一个异步函数,它获取一个项目列表,并使用自定义适配器将它们添加到ArrayList 问题是,当我按下按钮时,它会生成列表并将其添加到ListView,而不是。。。1,2,3,4,5,…20它是按随机顺序排列的。1,2,5,1,3,0,6,7,8,3,1 如果我向上或向下滚动ListView,它会改变 activity_main.xml: <?xml version="1.

我真的不知道怎么问这个但是

我的代码旨在通过单击按钮生成ListView输入

当我单击按钮时,它应该.execute()一个异步函数,它获取一个项目列表,并使用自定义适配器将它们添加到ArrayList>

问题是,当我按下按钮时,它会生成列表并将其添加到ListView,而不是。。。1,2,3,4,5,…20它是按随机顺序排列的。1,2,5,1,3,0,6,7,8,3,1

如果我向上或向下滚动ListView,它会改变

activity_main.xml:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    tools:context=".MainActivity">

    <Button
        android:id="@+id/bLoadData"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:text="Load api data" />

    <ListView
        android:id="@+id/lvMovies"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_above="@id/bLoadData"
        android:background="#efefef" />

</RelativeLayout>

结果_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">


        <ImageView android:id="@+id/ivPosters"
            android:layout_width="120dp"
            android:layout_height="120dp"
            android:src="@drawable/place_holder_img"/>

        <TextView
            android:id="@+id/results_layout_tv_movie_name"
            android:layout_width="0dp"
            android:layout_height="fill_parent"
            android:layout_weight="1"
            android:paddingBottom="10dp"
            android:paddingLeft="20dp"
            android:paddingStart="20dp"
            android:paddingTop="10dp"
            android:text="hellow"
            android:textColor="#000"
            android:textSize="20sp" />

    </LinearLayout>
</LinearLayout>

MainActivity.class:

package com.example.zdroa.testinggrounds;

import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ListView;

import java.util.ArrayList;
import java.util.HashMap;

public class MainActivity extends AppCompatActivity {

    static ArrayList<HashMap<String, String>> posters;
    ListView listView;
    Button button;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        listView = (ListView) findViewById(R.id.lvMovies);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                System.out.println(posters.get(position).values().toString());
            }
        });

        button = (Button) findViewById(R.id.bLoadData);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                posters = new ArrayList<>();
                ImageLoadTask ilt = new ImageLoadTask();
                ilt.execute();
            }
        });
    }


    private class ImageLoadTask extends AsyncTask<Void, Void, ArrayList<HashMap<String, String>>> {

        @Override
        protected ArrayList<HashMap<String, String>> doInBackground(Void... params) {

            posters = getPathFromAPI();
            return posters;
        }

        @Override
        protected void onPostExecute(ArrayList<HashMap<String, String>> result) {
            SearchAdapter adapter = new SearchAdapter(MainActivity.this, result);
            listView.setAdapter(adapter);
        }

        private ArrayList<HashMap<String, String>> getPathFromAPI() {
            String moviePaths[] = new String[10];

            for (int i = 0; i < moviePaths.length; i++) {
                HashMap<String, String> map = new HashMap<>();
                String s = "path";
                map.put(s, s + "_" + i);
                moviePaths[i] = "path_" + i;
                posters.add(map);
            }
            return posters;
        }
    }
}
package com.example.zdroa.testinggrounds;
导入android.os.AsyncTask;
导入android.os.Bundle;
导入android.support.v7.app.AppActivity;
导入android.view.view;
导入android.widget.AdapterView;
导入android.widget.Button;
导入android.widget.ListView;
导入java.util.ArrayList;
导入java.util.HashMap;
公共类MainActivity扩展了AppCompatActivity{
静态ArrayList海报;
列表视图列表视图;
按钮;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView=(listView)findViewById(R.id.lvMovies);
setOnItemClickListener(新的AdapterView.OnItemClickListener(){
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
System.out.println(posters.get(position.values().toString());
}
});
按钮=(按钮)findViewById(R.id.bLoadData);
setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
海报=新的ArrayList();
ImageLoadTask ilt=新建ImageLoadTask();
ilt.execute();
}
});
}
私有类ImageLoadTask扩展了AsyncTask{
@凌驾
受保护的ArrayList doInBackground(无效…参数){
海报=getPathFromAPI();
返回海报;
}
@凌驾
受保护的void onPostExecute(ArrayList结果){
SearchAdapter=新的SearchAdapter(MainActivity.this,result);
setAdapter(适配器);
}
私有ArrayList getPathFromAPI(){
字符串moviepath[]=新字符串[10];
对于(int i=0;i
SearchAdapter.class:

package com.example.zdroa.testinggrounds;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.v4.content.ContextCompat;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.squareup.picasso.Picasso;

import java.util.ArrayList;
import java.util.HashMap;

public class SearchAdapter extends BaseAdapter {

    private Context mContext;
    private ArrayList<HashMap<String, String>> array;
    private ImageView imageView;
    private TextView textView;

    SearchAdapter(Context context, ArrayList<HashMap<String, String>> paths) {
        mContext = context;
        array = paths;
    }

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

    @Override
    public Object getItem(int position) {
        return null;
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        if (convertView == null) {
            convertView = View.inflate(mContext, R.layout.results_layout, null);
            imageView = (ImageView) convertView.findViewById(R.id.ivPosters);
            textView = (TextView) convertView.findViewById(R.id.results_layout_tv_movie_name);
        }

        Drawable drawable = ContextCompat.getDrawable(mContext, R.drawable.place_holder_img);

        String link_end = array.get(position).values().toString();
        Picasso.with(mContext)
                .load("http://image.tmdb.org/t/p/w185" + link_end)
//                .resize(width, (int) (width * 1.5))
                .placeholder(drawable)
                .into(imageView);


        textView.setText(position+"");

        return convertView;
    }
}
package com.example.zdroa.testinggrounds;
导入android.content.Context;
导入android.graphics.drawable.drawable;
导入android.support.v4.content.ContextCompat;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.BaseAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
导入com.squareup.picasso.picasso;
导入java.util.ArrayList;
导入java.util.HashMap;
公共类SearchAdapter扩展了BaseAdapter{
私有上下文;
私有数组列表数组;
私人影像视图;
私有文本视图文本视图;
SearchAdapter(上下文、ArrayList路径){
mContext=上下文;
数组=路径;
}
@凌驾
public int getCount(){
返回array.size();
}
@凌驾
公共对象getItem(int位置){
返回null;
}
@凌驾
公共长getItemId(int位置){
返回0;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=查看.充气(mContext,R.layout.results\u layout,null);
imageView=(imageView)convertView.findViewById(R.id.ivd);
textView=(textView)convertView.findViewById(R.id.results\u layout\u tv\u movie\u name);
}
Drawable Drawable=ContextCompat.getDrawable(mContext,R.Drawable.place\u holder\u img);
字符串link_end=array.get(position).values().toString();
毕加索(McContext)
.加载(“http://image.tmdb.org/t/p/w185“+链接(结束)
//.调整大小(宽度(整数)(宽度*1.5))
.占位符(可绘制)
.进入(图像视图);
textView.setText(位置+“”);
返回视图;
}
}

在Asyntask类的onPost中

在为listview创建和设置适配器之后 在列表视图中列出您正在使用的列表

list=new ArrayList<>();
list=newarraylist();

只有当convertview为空时,才会设置imageview和textview引用…将这些行从括号中移出。

如果我将imageview内的图像大小从120乘以120dp更改为50乘以50dp(10结果),则不会发生问题,但是如果我也将结果从10改为20,那么代码中会再次出现这样的情况,即您应该只生成10项,而不是20项。每次它都会按顺序生成它们。问题出在其他地方只有当convertview为空时,才会设置imageview和textview引用…请将这些行移出括号。@ElDuderino将问题答复为答案,以便我可以正确标记它