2017-05-09 11 views
0

これはどのように質問するかわかりませんでしたが...リストビューの再作成が非同期で停止しないのはなぜですか?

私のコードは、ボタンクリックでListView入力を生成することを意図しています。

ボタンをクリックすると、アイテムのリストを取得してArrayListに追加するAsync()を実行する必要があります。< HashMap < String、String>>カスタムアダプタを使用します。

問題は、ボタンを押すと、リストが生成され、リストビューに追加されます。ただし、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> 

results_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; 
     } 
    } 
} 

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; 
    } 
} 
リストビュー 用のアダプタを作成し、設定した後、Asyntaskクラス

でonPost 0

+0

イメージビュー内のイメージのサイズを120から120dpに変更して50dpiで10個の結果に変更した場合、問題は発生しませんが、結果が10から20に変更された場合は再び発生します。 –

+0

20個ではなく10個のアイテムしか生成しないはずです。問題は別の場所にあります – bc004346

+0

あなたのimageviewとtextviewの参照は、convertviewがnullの場合にのみ設定されます...それらの行を括弧の外に移動します。 – ElDuderino

答えて

0

を使用しているリストを作りますis null ...これらの行を括弧の外に移動します。

0

ときconvertviewあなたのImageViewのとTextViewの参照のみが設定されていますが、リストビューに

list=new ArrayList<>(); 
関連する問題