2016-03-25 21 views
0

Her şeyden önce, LÜTFEN YARDIM EDİYORUM ... Neredeyse her şeyi çözdüm ve şimdi buradayım!Android geri dönüşümcü çıkışı düzgün göstermiyor görünümü

İlk kafa karışıklığı: neden dünya Async sınıfı çok yavaş çalışıyor, Android monitörde popüle dizi çıkışını görmek için SYSO kullanırken, api'den bazı verileri almak için tıklama olayını kullanıyorum, neredeyse 4,5 aldı her zaman arraylisti 20 elementle doldurmak için.

Toolbar toolbar; 
RecyclerView recyclerView; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main_news); 
    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    // Get Request 
    String url = "MY URL HERE"; 
    new JSONAsync(getApplicationContext()).execute(url); 

    recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); 
    RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(MainNews.this, JSONAsync.dataArray); 
    recyclerViewAdapter.notifyDataSetChanged(); 

    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.setAdapter(recyclerViewAdapter); 
    recyclerViewAdapter.notifyDataSetChanged(); 

} 

Async sınıf olarak yazılır:

Context context; 
public static List<Data> dataArray = new ArrayList<>(); 
public JSONAsync(Context context) { 
    this.context = context; 
    dataArray.clear(); 
} 
@Override 
protected Boolean doInBackground(String... params) { 

    try { 
     return downloadUrl(params[0]); 
    } catch (IOException e) { 
     return false; 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 

    return null; 
} 

public boolean downloadUrl(String myurl) throws IOException, JSONException { 
    InputStream is = null; 
    int response; 

    try { 
     URL url = new URL(myurl); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.connect(); 
     response = conn.getResponseCode(); 
     is = conn.getInputStream(); 
     if (response == 200) { 
      String responseBody = convertToString(conn.getInputStream()); 
      JSONArray jArray = new JSONArray(responseBody); 

      for (int i = 0; i < jArray.length(); i++) { 
       JSONObject jobj = jArray.getJSONObject(i); 
       System.out.println("Output is: ....."+jobj); 
       Data data = new Data(); 
       data.setId(jobj.getInt("id")); 
       data.setHeading(jobj.getString("heading")); 
       data.setBrief(jobj.getString("brief")); 
       data.setDate(jobj.getString("date")); 
       String imageURL = "http://paktribune.com/images/news/"; 
       imageURL = imageURL.concat(jobj.getString("limage")); 
       data.setImage(getBitmapFromURL(imageURL)); 
       dataArray.add(data); 
      } 

      return true; 
     } else return false; 

    } finally { 
     if (is != null) { 
      is.close(); 
     } 
    } 

} 

public Bitmap getBitmapFromURL(String imageURL) { 
    Bitmap myBitmap = null; 
    try { 
     int responseCode; 
     URL url = new URL(imageURL); 
     HttpURLConnection connection = (HttpURLConnection) url.openConnection(); 
     connection.setDoInput(true); 
     connection.connect(); 
     responseCode = connection.getResponseCode(); 
     if (responseCode==200) 
     { 
     InputStream input = connection.getInputStream(); 
     myBitmap = BitmapFactory.decodeStream(input); 
     } 

    } catch (IOException e) { 
     e.printStackTrace(); 
     return null; 
    } 

    return myBitmap; 

} 

public String convertToString(InputStream is) { 
    BufferedReader reader = new BufferedReader(new InputStreamReader(is)); 
    StringBuilder sb = new StringBuilder(); 
    String line = null; 
    try { 
     while ((line = reader.readLine()) != null) { 
      sb.append(line).append("\n"); 
     } 
    } catch (IOException e) { 
    } finally { 
     try { 
      is.close(); 
     } catch (IOException e) { 
     } 
    } 

    return sb.toString(); 
} 

@Override 
protected void onPostExecute(Boolean result) { 

    if (result == false) { 
     Toast.makeText(context, "Unable to fetch data from server", Toast.LENGTH_SHORT).show(); 
    } 

} 

Ve adaptör geçerli:

ben şu anda bilmiyorum çok yanlış bir şey ....

Etkinlik kodudur olmalı

private LayoutInflater inflater; 
Context context; 
List<Data> dataArray; 
private int lastPosition = -1; 

public RecyclerViewAdapter(Context context, List<Data> dataArray) { 
    this.dataArray = dataArray; 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
} 

@Override 
public RecyclerViewAdapter.CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    View view = inflater.inflate(R.layout.cardview, parent, false); 
    CustomViewHolder holder = new CustomViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(CustomViewHolder holder, int position) { 
    Data current = dataArray.get(position); 
    holder.textView1.setText(current.heading); 
    holder.textView2.setText(current.date); 
    holder.textView3.setText(current.brief); 
    holder.image.setImageBitmap(current.image); 
    setAnimation(holder.relativeLayout, position); 
} 

@Override 
public int getItemCount() { 
    return dataArray.size(); 
} 

public static class CustomViewHolder extends admin.myproject.CustomViewHolder { 
    ImageView image; 
    RelativeLayout relativeLayout; 
    TextView textView1, textView2, textView3; 

    public CustomViewHolder(View itemView) { 
     super(itemView); 
     textView1 = (TextView) itemView.findViewById(R.id.heading); 
     textView2 = (TextView) itemView.findViewById(R.id.date); 
     textView3 = (TextView) itemView.findViewById(R.id.brief); 
     image = (ImageView) itemView.findViewById(R.id.imageView); 
     relativeLayout = (RelativeLayout) itemView.findViewById(R.id.Relative); 
    } 

} 

private void setAnimation(View viewToAnimate, int position) { 

    if (position > lastPosition) { 
     Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); 
     viewToAnimate.startAnimation(animation); 
     lastPosition = position; 
    } 

} 

012'de döngüden önce bazı düğmeyi tıklattığımda uygulamanın neden bir sonraki etkinliğe geçtiğini söyleyen var mı?tamamlar. dataArray öğesini temizliyorum ve ayrıca notifyDataSetChanged()'u güncelliyorum. doInBackground() veya postExecute yönteminde notifyDataSetChanged()'u kullanırsanız, yalnızca Null işaretçisinin istisnasını işaret eder, bu yüzden onu bağdaştırıcıda kullanmamın sebebi olur, ancak sanırım orada da kullanmak iyi olur.

LÜTFEN YARDIM EDİN çocuklar!

cevap

1

Mantığınız hatalı ve uygulama çok sorunlu sorunlara karşı savunmasız.

1) Async görevi, ad suggets görevi olarak görevini eşzamanlı olarak gerçekleştirir. Yani, new JSONAsync(getApplicationContext()).execute(url); hattı hemen döner ve etkinlikte yürütme devam eder. Bağdaştırıcıya verilerin hazır olduğunu söylediğinizde, büyük olasılıkla hazır değildir ve asenkron görev, işini ortalama zamanda yapmaya çalışır.

2) Çok parçalı bir ortamda iletişim kurmak için statik üyeyi kullanmak hatalara açıktır. Bunun yerine, etkinliğinize bir dinleyici arabirimi uygulayın ve eşzamanlı görevin onPostExecute'da dinleyici yöntemini çağırmasına izin verin. Sadece sonra adaptöre veri değişimi hakkında bilgi verin.

private List<Data> dataArray = new ArrayList<>(); 
private IAsyncTaskListener listener; 
public JSONAsync(Context context, IAsyncTaskListener listener) { 
    this.context = context; 
    this.listener = listener; 
} 
public interface IAsyncTaskListener { 
    void onCompleted(List<Data> dataArray); 
} 

@Override 
protected void onPostExecute(Boolean result) { 
    this.listener.onCompleted(dataArray); 
} 

Sizin aktivite IAsyncTaskListener

public class YourActivity extends AppCompatActivity implements JSONAsync.IAsyncTaskListener { 
    @Override 
    public void onCompleted(List<Data> dataArray) { 
     recyclerViewAdapter.setData(dataArray); 
     recyclerViewAdapter.notifyDataSetChanged(); 
    } 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main_news); 
     toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Get Request 
     String url = "http://paktribune.com/api/newsList"; 
     new JSONAsync(getApplicationContext(), this).execute(url); 

     recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
     LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false); 
     RecyclerViewAdapter recyclerViewAdapter = new RecyclerViewAdapter(MainNews.this); 

     recyclerView.setLayoutManager(layoutManager); 
     recyclerView.setAdapter(recyclerViewAdapter); 

    } 
} 

Sen adaptörünün verileri değiştirmek için bir yöntem sağlayacaktır uygulayabilir. Dinleyici geri çağırmasında, bağdaştırıcıdaki verileri ayarlarsınız ve bağdaştırıcıya değişikliklerle ilgili bilgi vermek için üzerinde notifyDataSetChanged numaralı telefonu arayın.

+0

Önerileriniz için teşekkürler, AsyncTask'ın ne olduğu hakkında bilgi edinmeye yardımcı olun! SetData() yöntemini sağladığını söylediğinizde bilmeniz gereken tek şey, dataArray değerini public void setData (List dataArray) { ) gibi RecyclerViewAdapter sınıfında ayarlamanızdır.dataArray = dataArray } böylece onCreateView(), onBindView() getItemCount() verilere erişebilir! Doğru ... Bunu yaptım ama NPE'yi işaret ediyor. Bunu soruyorum çünkü neredeyse android'de yeni başlayan biriyim ve bu alanda sağlam bir tutuşum yok – Umair

+0

Anladım! Ve rehberliğin için teşekkürler. Gerçekten yardımcı oldu: D – Umair

0

Görüntüleri indirmek için Picasso veya Glide kitaplığını kullanarak deneyin. Bu kütüphaneler daha hızlı yüklemeler sağlayabilir, önbellek kullanımı daha iyidir.

İlgili konular