0

Android Hive のコードを見て、配列 JSON を PHP スクリプトから Android / Java コードに送信する方法を学びました。オンライン データベースからすべての詳細を正常に取得し、目的の形式で表示しました。

問題は、画像が ListView 内にあるときに画像の src を設定する方法がわからないことです。これが私のコードです。

                ArrayList<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
                JSONParser jParser = new JSONParser();
                JSONObject json = jParser.getJSONFromUrl("http://domain.com/directory/database/retrieveComments.php?placeId=" + stringPlaceId);
                try
                {
                    commentsRatingsArray = json.getJSONArray("commentsRatings");
                    for(int i = 0; i < commentsRatingsArray.length(); i++)
                    {
                        JSONObject jsonObject = commentsRatingsArray.getJSONObject(i);
                        String dbUserFullName = jsonObject.getString(TAG_FULLNAME);
                        String dbUserEmail = jsonObject.getString(TAG_EMAIL);
                        String dbComment = jsonObject.getString(TAG_COMMENT);
                        String dbRating = jsonObject.getString(TAG_RATING);
                        String dbDate = jsonObject.getString(TAG_DATE);
                        String dbTime = jsonObject.getString(TAG_TIME);

                        HashMap<String, String> map = new HashMap<String, String>();
                        map.put(TAG_FULLNAME, dbUserFullName);
                        map.put(TAG_EMAIL, dbUserEmail);
                        map.put(TAG_COMMENT, dbComment);
                        map.put(TAG_RATING, dbRating);
                        map.put(TAG_DATE, dbDate);
                        map.put(TAG_TIME, dbTime);

                        list.add(map);
                    }   
                }
                catch (Exception e)
                {
                    e.printStackTrace();
                    Toast.makeText(getBaseContext(), "Connection to the server is lost. Please check your internet connection.", Toast.LENGTH_SHORT).show();
                }

                ListAdapter adapter = new SimpleAdapter
                        (DisplayCommentsRatings.this, list, R.layout.commentrating,

                            new String[] { TAG_FULLNAME, TAG_EMAIL, TAG_COMMENT, TAG_DATE,  TAG_TIME },
                            new int[] {R.id.tvUserFullName, R.id.tvUserEmail, R.id.tvUserComment, R.id.tvDate, R.id.tvTime });

                setListAdapter(adapter);

助けてください、ありがとう。

4

4 に答える 4

5

そのために、ListView 用のカスタム アダプターを定義することをお勧めします。

  1. BaseAdapter または ArrayAdapter のいずれかを拡張することにより、カスタム アダプター クラスを作成できます。
  2. getView() メソッドをオーバーライドします。
  3. getView() メソッドをオーバーライドしながら ViewHolder パターンに従います。

ここで、Ravi は次のように書いています: Android カスタム ListView with Images and Text

これまでの最良の解決策: Andoid - ListView での画像の遅延ロード

于 2012-08-06T09:46:44.123 に答える
0

たとえば、ファイルの SD 名を指す URL を使用して画像を設定できます。

http://developer.android.com/reference/android/widget/SimpleAdapter.html#setViewImage(android.widget.ImageView , int)

しかし、BaseAdapter から拡張して独自の Map または Array を渡す方がはるかに簡単だと思います。その後、必要な画像を膨らませたり、ダウンロードして設定したりできます。

これは、デバイス用の 1 つのアダプターの例です:) viewHolder パターンから始める必要はありません。

public class DevicesAdapter extends BaseAdapter {
private LayoutInflater inflater;
private List<Device> devices;

public DevicesAdapter(Context context, List<Device> devices) {
    inflater = LayoutInflater.from(context);
    this.devices = devices;
}

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

@Override
public Object getItem(int position) {
    return devices.get(position);
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    View row = convertView;
    if (row == null) {
        row = inflater.inflate(R.layout.account_devices_row, null);
    }
    TextView description = (TextView) row.findViewById(R.id.device_text);
    description.setText(devices.get(position).getLabel());
    return row;
}

}

よろしく

于 2012-08-06T09:51:45.210 に答える
0

独自のカスタム アダプター (拡張) を作成し、メソッドBaseAdapter内のイメージを更新する必要があると思います。getViewGoogle にはたくさんのツッツがあります。

頑張ってください=)

于 2012-08-06T09:46:44.097 に答える
0

それらは上記で正しいです。BaseAdapter を拡張し、getView メソッドを上書きする必要があります。また、画像をダウンロードし、このアクションの実行中に UI スレッドを拘束してはならないため、画像を遅延読み込みする必要があります。以下は私のLazy Loadクラスです。簡単に新しいクラスを作成し(私はLazyLoadImage.javaと呼びます)、このコードをそれに貼り付けます。以下は、クラスを使用できるさまざまな方法です。

プレースホルダーを使用して画像を遅延読み込みするには:

new LazyLoadImage(ImageView imageView, String urlString, Bitmap placeHolder);

プレースホルダーなしで画像を遅延ロードするには:

new LazyLoadImage(ImageView imageView, String urlString);

キャッシュを手動でクリアするには:

new LazyLoadImage().clearCache();

12 未満の OS をターゲットにしている場合は、プロジェクトに「android-support-v4.jar」を含める必要があります。

import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v4.util.LruCache;
import android.util.Log;
import android.widget.ImageView;

public class LazyLoadImage extends AsyncTask<String, Void, Bitmap> {

ImageView mDestination;

//Set up cache size and cache
private static int mCacheSize = 4 * 1024 * 1024; // 4 mb
private static LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(mCacheSize) {
    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight();
    }
};


public LazyLoadImage(ImageView destination, String urlString) {
    mDestination = destination;

    if (mCache.get(urlString) != null) {
        mDestination.setImageBitmap(mCache.get(urlString));
    }else {
        this.execute(urlString);
    }
}

public LazyLoadImage(ImageView destination, String urlString, Bitmap placeHolder) {
    mDestination = destination;

    if (mCache.get(urlString) != null) {
        mDestination.setImageBitmap(mCache.get(urlString));
    }else {
        setPlaceHolder(urlString, placeHolder);
        this.execute(urlString);
    }
}

public LazyLoadImage() {
}

private void setPlaceHolder(String urlString, Bitmap placeholder) {
    mDestination.setImageBitmap(placeholder);
}

public void clearCache() {
    mCache.evictAll();
}

@Override
protected Bitmap doInBackground(String... arg0) {

    //If the URI that is passed in arg0[0] is already in mCache then I return it without downloading it again
    if (mCache.get(arg0[0]) != null) {
        return mCache.get(arg0[0]);
    }else {

        Bitmap lazyImage = null;
        URL myFileUrl = null;          

        try {
             myFileUrl= new URL(arg0[0]);
             HttpURLConnection conn= (HttpURLConnection)myFileUrl.openConnection();
             conn.setDoInput(true);
             conn.connect();
             InputStream is = conn.getInputStream();

             lazyImage = BitmapFactory.decodeStream(is);

             //Store the image in mCache for quick assess from anywhere in app
             synchronized (mCache) {
                if (mCache.get(arg0[0]) == null) {
                    mCache.put(arg0[0], lazyImage);
                }
             }

        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return lazyImage;
    }
}

@Override
protected void onCancelled(Bitmap result) {

}

@Override
protected void onPostExecute(Bitmap result) {

    /*
     * The returned image to the ImageView that was passed in on create
     *  (either from mCache or when downloaded the first time)
     */
    mDestination.setImageBitmap(result);

    super.onPostExecute(result);
}

}
于 2012-08-06T17:12:45.057 に答える