网格/列表视图的概念如何将图像发送到imageitem类 [英] concept of grid/list view how to send image to imageitem class

查看:123
本文介绍了网格/列表视图的概念如何将图像发送到imageitem类的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的项目中,我想加载url图像并将它们显示在gridview活动中。但如何将这些图像加载到GridView适配器?



所以我想了解 grid / list视图 adapter,据我所知。在一个基本的例子中,它包含3个活动:

1-Main activity
p>

实际上它包含 gridview 布局的定义,该方法的定义 GridViewAdapter (第三个活动),在网格视图中设置适配器。以及要在 GridViewAdapter 方法中发送的数据或数组映像(第二个活动)。

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

gridView =(GridView)findViewById(R.id.gridView);
gridAdapter = new GridViewAdapter(this,R.layout.grid_item_layout,getData());
gridView.setAdapter(gridAdapter);

$ / code>

确定我的问题是在GridView适配器中发送图像的方式是什么?



示例他们用这种方式,但我不需要TypedArray为我的项目,实际上边问题,我什么时候需要使用它?

  private ArrayList< ImageItem> getData(){
final ArrayList< ImageItem> imageItems = new ArrayList<>();
TypedArray imgs = getResources()。obtainTypedArray(R.array.image_ids);
for(int i = 0; i< imgs.length(); i ++){
Bitmap bitmap = BitmapFactory.decodeResource(getResources(),imgs.getResourceId(i,-1));
imageItems.add(new ImageItem(bitmap,Image#+ i));
}
return imageItems;
}

在另一个示例他们使用的资源

  mItems = new的ArrayList< GridViewItem>(); 
资源resources = getResources();

mItems.add(new GridViewItem(resources.getDrawable(R.drawable.aim),getString(R.string.aim)));

mItems.add(新的GridViewItem(resources.getDrawable(R.drawable.youtube),getString(R.string.youtube)));

在另一个例子他们使用静态图像



好吧我明白他们正在从可绘制的图像中获取图像,但是我应该怎么做才能将它们显示在我的活动中

- 请继续我的解释我做了一些错误



2-Imageitem 它存储图像的另一个活动不需要进入它。

>

3-GridViewAdapter



好的,我们在这里创建类的构造函数, getview方法在进入之前应该添加 getcount()方法或 getitem()
convertview用于获取旧视图,持有者可以保存我猜想的图像。现在
ofcourse ImageItem 是空的,因为我没有在主要活动中定义它。所以如何做到这一点?


  public class GridViewAdapter extends ArrayAdapter {
private context context;
private int layoutResourceId;
private ArrayList data = new ArrayList();

public GridViewAdapter(Context context,int layoutResourceId,ArrayList data){
super(context,layoutResourceId,data);
this.layoutResourceId = layoutResourceId;
this.context = context;
this.data = data;
}

@Override
public View getView(int position,View convertView,ViewGroup parent){
View row = convertView;
ViewHolder holder = null;

if(row == null){
LayoutInflater inflater =((Activity)context).getLayoutInflater();
row = inflater.inflate(layoutResourceId,parent,false);
holder = new ViewHolder();
holder.imageTitle =(TextView)row.findViewById(R.id.text);
holder.image =(ImageView)row.findViewById(R.id.image);
row.setTag(持有者);
} else {
holder =(ViewHolder)row.getTag();
}

ImageItem item = data.get(position);
holder.imageTitle.setText(item.getTitle());
holder.image.setImageBitmap(item.getImage());


毕加索。
与(mContext)。
load(ImageItem .Getimage())
.placeholder(R.drawable.ic_launcher)
.fit()$ b $ .into(holder.imageView);

返回行;
}

静态类ViewHolder {
TextView imageTitle;
ImageView图像;
}
}

edt

  //异步下载数据
public class AsyncHttpTask extends AsyncTask< String,Void,Integer> {

@Override
保护Integer doInBackground(String ... params){
整数结果= 0;
尝试{
//创建Apache HttpClient
HttpClient httpclient = new DefaultHttpClient();
HttpResponse httpResponse = httpclient.execute(new HttpGet(params [0]));
int statusCode = httpResponse.getStatusLine()。getStatusCode();

// 200代表HTTP OK
if(statusCode == 200){
String response = streamToString(httpResponse.getEntity()。getContent());
parseResult(response);
结果= 1; //成功
} else {
result = 0; (例外e){
Log.d(TAG,e.getLocalizedMessage());
}
返回结果; $

} catch b

@Override
protected void onPostExecute(Integer result){
//下载完成。让我们更新UI
if(result == 1) {
mGridAdapter.setGridData(mGridImages);
mGridAdapter.notifyDataSetChanged();
} else {
Toast.makeText(MainActivity.this,No Connection found,Check your Connection! ,Toast.LENGTH_SHORT).show();
}
mProgressBar.setVisibility(View.GONE);
}
}

String streamToString( InputStream stream)抛出IOException {
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
String line;
String result =;
while((line = bufferedReader .readLine())!= null){
result + = line;
}

//关闭流
if(null!= stream){
stream.close();
}
返回结果;

$ b $ **
解析提要结果并获得列表
* @param结果
* /
private void parseResult (String result){
try {

JSONObject response = new JSONObject(result);
JSONArray posts = response.optJSONArray(result);
GridImages项目;
for(int i = 0; i< posts.length(); i ++){
JSONObject post = posts.optJSONObject(i);
String title = post.optString(name);
String image = post.optString(path);
item = new GridImages();
item.Settitle(title);
item.Setimage(image);
// JSONArray attachments = post.getJSONArray(attachments);
// if(null!= attachments&& attachments.length()> 0){
// JSONObject attachment = attachments.getJSONObject(0);
// if(attachment!= null)
// item.Setimage(attachment.getString(url));
//}
mGridImages.add(item);
}
} catch(JSONException e){
e.printStackTrace();



$ div $解析方案

你不应该在适配器内部使用位图,因为当它位于listview或gridview中时,它会消耗很多内存,listview无法一次回收。因此,请尝试使用picasso从url加载位图或图像。


In my project I want to load url Images and display them in gridview activity. but how to load those image to the gridview adapter?

so I am trying to understand the concept of grid/list view adapter and as I understand .in a basic example ,it contain 3 activities:

1-Main activity

Useally it contains the definition of gridview layout , the definition of the method GridViewAdapter (third activity) ,setting the adapter in the grid view. and the data or the array image(second activity) that to be send in the GridViewAdapter method.

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

        gridView = (GridView) findViewById(R.id.gridView);
        gridAdapter = new GridViewAdapter(this, R.layout.grid_item_layout, getData());
        gridView.setAdapter(gridAdapter);
    }

ok my problem is what are the ways to send the image in the gridview adapter?

in this example they used this way , but I dont need TypedArray for my project , actually side question when do I need to use it ?

  private ArrayList<ImageItem> getData() {
        final ArrayList<ImageItem> imageItems = new ArrayList<>();
        TypedArray imgs = getResources().obtainTypedArray(R.array.image_ids);
        for (int i = 0; i < imgs.length(); i++) {
            Bitmap bitmap = BitmapFactory.decodeResource(getResources(), imgs.getResourceId(i, -1));
            imageItems.add(new ImageItem(bitmap, "Image#" + i));
        }
        return imageItems;
    }

in another example they used resource

mItems = new ArrayList<GridViewItem>();
Resources resources = getResources();

mItems.add(new GridViewItem(resources.getDrawable(R.drawable.aim), getString(R.string.aim)));
:
mItems.add(new GridViewItem(resources.getDrawable(R.drawable.youtube), getString(R.string.youtube)));

in another example they used static images

Ok I do understand they are getting the image from drawable , but what should I do to display them in my activity

-- Ill continue my explanation incase there is something wrong I did

2-Imageitem its the another activity where it store the image no need to go into it .

3-GridViewAdapter

ok here we create the constructor of the class , and we create the getview method , before getting into it , should I add getcount() method or getitem() The convertview is used to get the old view, and the holder to hold the image I guess. ofcourse for now ImageItem is empty because I didnt define it in the main activity. so how to do that ?

public class GridViewAdapter extends ArrayAdapter {
    private Context context;
    private int layoutResourceId;
    private ArrayList data = new ArrayList();

    public GridViewAdapter(Context context, int layoutResourceId, ArrayList data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        ViewHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);
            holder = new ViewHolder();
            holder.imageTitle = (TextView) row.findViewById(R.id.text);
            holder.image = (ImageView) row.findViewById(R.id.image);
            row.setTag(holder);
        } else {
            holder = (ViewHolder) row.getTag();
        }

        ImageItem item = data.get(position);
        holder.imageTitle.setText(item.getTitle());
        holder.image.setImageBitmap(item.getImage());


    Picasso.
    with(mContext).
    load(ImageItem .Getimage())
    .placeholder(R.drawable.ic_launcher) 
     .fit() 
    .into(holder.imageView);

        return row;
    }

    static class ViewHolder {
        TextView imageTitle;
        ImageView image;
    }
}

edt

//Downloading data asynchronously
public class AsyncHttpTask extends AsyncTask<String, Void, Integer> {

    @Override
    protected Integer doInBackground(String... params) {
        Integer result = 0;
        try {
            // Create Apache HttpClient
            HttpClient httpclient = new DefaultHttpClient();
            HttpResponse httpResponse = httpclient.execute(new HttpGet(params[0]));
            int statusCode = httpResponse.getStatusLine().getStatusCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                String response = streamToString(httpResponse.getEntity().getContent());
                parseResult(response);
                result = 1; // Successful
            } else {
                result = 0; //"Failed
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }
        return result;
    }

    @Override
    protected void onPostExecute(Integer result) {
        // Download complete. Let us update UI
        if (result == 1) {
            mGridAdapter.setGridData(mGridImages);
            mGridAdapter.notifyDataSetChanged();
        } else {
            Toast.makeText(MainActivity.this, "No Connection found,Check your Connection!", Toast.LENGTH_SHORT).show();
        }
        mProgressBar.setVisibility(View.GONE);
    }
}

String streamToString(InputStream stream) throws IOException {
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(stream));
    String line;
    String result = "";
    while ((line = bufferedReader.readLine()) != null) {
        result += line;
    }

    // Close stream
    if (null != stream) {
        stream.close();
    }
    return result;
}

/**
 * Parsing the feed results and get the list
 * @param result
 */
private void parseResult(String result) {
    try {

        JSONObject response = new JSONObject(result);
        JSONArray posts = response.optJSONArray("result");
        GridImages item;
        for (int i = 0; i < posts.length(); i++) {
            JSONObject post = posts.optJSONObject(i);
            String title = post.optString("name");
            String image=post.optString("path");
            item = new GridImages();
            item.Settitle(title);
            item.Setimage(image);
         //   JSONArray attachments = post.getJSONArray("attachments");
           // if (null != attachments && attachments.length() > 0) {
             //   JSONObject attachment = attachments.getJSONObject(0);
               // if (attachment != null)
                 //   item.Setimage(attachment.getString("url"));
            //}
            mGridImages.add(item);
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

解决方案

You Should not use bitmap inside the adapter because when it is in listview or gridview it will consume lot of memory which listview cannot recycle at once. So try using picasso to load the bitmap or image from url.

这篇关于网格/列表视图的概念如何将图像发送到imageitem类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆