1

ListViewにアニメーションを追加しようとしています.HTTP GETリクエストの結果としてテキストが別の行にフェードします。私はフェードインの効果を知っているし、すでにカスタムのListViewアダプタを持っていますが、問題は、結果が来るたびにListViewがすべての行を更新するため、リスト全体のフェードがトリガされるということです。ListViewの単一行を制御する

リストビューが各データ変更のすべての行をアニメーション化しないように、どのように1行を制御することができますか?

これは私がリストビューを埋めるために使用するコードです:

private class CustomAdapter extends ArrayAdapter<Row> { 

    public CustomAdapter() { 
     super(Results.this, R.layout.row, dataList); 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     View row = convertView; 
     RowHolder holder = null; 
     if (row == null) { 
      LayoutInflater inflater = getLayoutInflater(); 

      row = inflater.inflate(R.layout.row, parent, false); 
      holder = new RowHolder(row); 
      row.setTag(holder); 
     } else { 
      holder = (RowHolder) row.getTag(); 
     } 
     try { 
      holder.populateRow(dataList.get(position)); 
     } catch (NullPointerException e) { 
      e.printStackTrace(); 
     } 
     return row; 
    } 

} 

    private class RowHolder { 
     private TextView label = null; 
     private TextView count = null; 
     private TextView result = null; 

     public RowHolder(View row) { 
      label = (TextView) row.findViewById(R.id.list_label); 
      count = (TextView) row.findViewById(R.id.list_count); 
      result = (TextView) row.findViewById(R.id.list_result); 
     } 

     public void populateRow(Row r) { 
      label.setText(r.getLabel()); 
      count.setText(r.getCount()); 
      result.setText(r.getResult()); 
      label.startAnimation(fadeIn); 
      count.startAnimation(fadeIn); 
      result.startAnimation(fadeIn); 
     } 
    } 

すべてのヘルプは高く評価され、事前にあなたに感謝!

編集1:

マイAsyncTask:

private class CheckSource extends AsyncTask<String, Void, String> { 

    protected void onPreExecute() { 
     results.setUnixTime(getUnixTime()); 
     results.setLabel(getString(R.string.label)); 
     results.setCount(null); 
     results.setResult(null); 
     results.setResultLabel(""); 
     results.setShowProgress(true); 
     results.setIconType(null); 
     results.setShowIcon(false); 
     results.setHasResults(false); 
     adapter.notifyDataSetChanged(); 
    } 

    @Override 
    protected String doInBackground(String... params) { 

     String query = params[0]; 
     String httpResults = null; 

     try { 
      httpResults = getResults(query, "source"); 
      jsonObject = new JSONObject(httpResults); 
     } catch (IllegalStateException e) { 
      e.printStackTrace(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
     } catch (URISyntaxException e) { 
      e.printStackTrace(); 
     } 
     return httpResults; 
    } 

    protected void onPostExecute(String results) { 
     try { 
      parseJSON(results); 
     } catch (JSONException e) { 
      e.printStackTrace(); 
      results.setResultLabel("<br />" 
        + getString(R.string.source_not_available) + "<br />"); 
     } 
     results.setShowProgress(false); 
     adapter.notifyDataSetChanged(); 
    } 

    // Parse the retrieved json results 
    private void parseJSON(String jsonResults) throws JSONException { 
     if (jsonResults == null) { 
      results.setResult(null); 
      results.setHasResults(false); 
      results.setResultLabel("<br />" 
        + getString(R.string.source_not_available) + "<br />"); 
      return; 
     } 
     jsonObject = new JSONObject(jsonResults); 
     String result = null; 
     String resultLabel = null; 
     switch (jsonObject.getInt("count")) { 
     case -1: 
      results.setCount(null); 
      results.setHasResults(false); 
      resultLabel = getString(R.string.no_results); 
      break; 
     case 0: 
      results.setCount(null); 
      results.setHasResults(false); 
      resultLabel = getString(R.string.no_results); 
      break; 
     case 1: 
      results.setHasResults(true); 
      results.setCount(jsonObject.get("count").toString() + " " 
        + getString(R.string.one_result)); 
      result = jsonObject.get("url").toString(); 
      resultLabel = getString(R.string.hyperlink_text); 
      break; 
     default: 
      results.setHasResults(true); 
      results.setCount(jsonObject.get("count").toString() + " " 
        + getString(R.string.multiple_results)); 
      result = jsonObject.get("url").toString(); 
      resultLabel = getString(R.string.hyperlink_text); 
      break; 
     } 
     results.setResult(result); 
     results.setResultLabel("<br />" + resultLabel + "<br />"); 
    } 
} 

HTTPリクエストを実行する方法:

private String getResults(String query, String source) 
     throws IllegalStateException, IOException, URISyntaxException { 

    /* Method variables */ 
    StringBuilder builder = new StringBuilder(); 
    String URL = "url"; 
    URI uri; 
    String phrase = "phrase"; 
    List<NameValuePair> params = new ArrayList<NameValuePair>(); 

    /* HTTP variables */ 
    HttpGet httpGet; 
    DefaultHttpClient httpClient; 
    HttpResponse httpResponse; 
    HttpEntity httpEntity; 
    HttpParams httpParams; 

    int socketTimeout = 10000; 
    int connectionTimeout = 10000; 

    // Set the socket and connection timeout values 
    httpParams = new BasicHttpParams(); 
    HttpConnectionParams 
      .setConnectionTimeout(httpParams, connectionTimeout); 
    HttpConnectionParams.setSoTimeout(httpParams, socketTimeout); 
    httpClient = new DefaultHttpClient(httpParams); 
    // Add parameters to the GET request 
    params.add(new BasicNameValuePair("query", query)); 
    params.add(new BasicNameValuePair("type", source)); 
    String paramString = URLEncodedUtils.format(params, "utf-8"); 
    uri = new URI(URL + paramString); 
    httpGet = new HttpGet(uri); 
    // Execute the GET request 
    httpResponse = httpClient.execute(httpGet); 

    /* Read http response if http status = 200 */ 
    if (httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK) { 
     httpEntity = httpResponse.getEntity(); 
     InputStream content = httpEntity.getContent(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(
       content)); 
     String line; 
     while ((line = reader.readLine()) != null) { 
      builder.append(line); 
     } 
    } 
    return builder.toString(); 
} 
+0

HTTP GETリクエスト後にコードを提供してください。 –

+0

遅れて申し訳ありませんが、あなたが投稿したコードを追加しました。 – Meatje

答えて

5

ロマン・ガイは、GoogleのI/Oセッション中にしばらく前に説明したように、唯一のリストビューにあるビューを更新するための最も効率的な方法は、(この1つは全体のビューデータを更新する)は、次のようなものです:

ListView list = getListView(); 
int start = list.getFirstVisiblePosition(); 
for(int i=start, j=list.getLastVisiblePosition();i<=j;i++) 
    if(target==list.getItemAtPosition(i)){ 
     View view = list.getChildAt(i-start); 
     list.getAdapter().getView(i, view, list); 
     break; 
    } 

と仮定すると、targetはアダプターの1つの項目です。

このコードは、現在表示されているビューを閲覧するあなたは、各表示ビュー項目を探しているtarget項目を比較し、あなたの目標は、それらの間であれば、外側のビューを取得し、その上でアダプタgetViewを実行し、ListViewを取得します表示をリフレッシュするためのビュー。サイドノートinvalidateとして

は何人かの人々が期待するように動作していないと、 notifyDataSetChangedは、リスト全体を再構築し、また束に影響を与えるだろう、すべての表示された項目のための getviewinvalidateViewsを呼び出すことになりますんgetViewメソッドのような表示を更新しません。

最後の1つは、行ビューの子を変更するだけで、行全体ではなくgetViewのように変更する必要がある場合は、さらにパフォーマンスを向上させることができます。我々は信頼コードで

((TextView)view.findViewById(R.id.myid)).setText("some new text"); 

:その場合は、次のコードは、list.getAdapter().getView(i, view, list);TextViewテキストを変更する例)を置き換えることができます。

+0

ありがとう、非常に明確で完全なexplaination。 – Meatje

+0

@GriffonRL:こんにちは、ここでターゲットは何を表していますか? – Aerrow

+0

ありがとう!巨大な助け! –

0

方法ListViewのすべての可視要素にgetViewメソッドを呼び出すnotifyDataSetChanged力。 ListViewの特定の項目を1つだけ更新する場合は、この項目をAsynhTaskに渡す必要があります。