Java 将可提取资源添加到ListView中

Java 将可提取资源添加到ListView中,java,android,listview,android-assets,Java,Android,Listview,Android Assets,我在assets文件夹中添加了许多图像,希望从那里获取这些图像并将其添加到ListView中。 当我执行应用程序时,一切都很完美,但listview的图像容器显示为空白(透明)。 Java文件: package com.basil.victor; import android.graphics.drawable.Drawable; import android.os.Bundle; import android.support.v4.app.Fragment; import android.v

我在assets文件夹中添加了许多图像,希望从那里获取这些图像并将其添加到ListView中。 当我执行应用程序时,一切都很完美,但listview的图像容器显示为空白(透明)。

Java文件:

package com.basil.victor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import java.io.IOException;
import java.io.InputStream;

public class Events extends Fragment {

private ListView listEvent;

String eventname[]={
        "Name",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};

String eventlogoname[]={
        "Logo",
        "name",
        "of",
        "events",
        "are",
        "present",
        "here"
};

Drawable[] arr=new Drawable[7];

String eventsubtitle []={
        "Subtitles",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_events, null);



    for(int i=0;i<7;i++) {
        try {
            InputStream stream = getContext().getAssets().open(eventlogoname[i] + ".jpg");
            Drawable el = Drawable.createFromStream(stream, null);
            arr[i] = el;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    EventList adapter = new
            EventList(getActivity(), eventname, arr, eventsubtitle);
    //ListView lv = (ListView)rootView.
    listEvent=(ListView)view.findViewById(R.id.listEvent);
    listEvent.setAdapter(adapter);


    return view;
}
}
package com.basil.victor;
导入android.graphics.drawable.drawable;
导入android.os.Bundle;
导入android.support.v4.app.Fragment;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ListView;
导入java.io.IOException;
导入java.io.InputStream;
公共类事件扩展片段{
私有ListView listEvent;
字符串eventname[]={
“姓名”,
“of”,
",,
“活动”,
“是”,
“现在”,
“这里”
};
字符串EventLogonName[]={
“标志”,
“姓名”,
“of”,
“活动”,
“是”,
“现在”,
“这里”
};
可提取[]arr=新的可提取[7];
字符串事件字幕[]={
“字幕”,
“of”,
",,
“活动”,
“是”,
“现在”,
“这里”
};
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u事件,空);

对于(int i=0;i为什么要对图像使用资产文件夹?如果没有必要,则可以对相同的图像使用drawable,将所有图像放在drawable文件夹中,然后

package com.basil.victor;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;

import java.io.IOException;
import java.io.InputStream;

public class Events extends Fragment {

private ListView listEvent;

String eventname[]={
        "Name",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};



int[] arr=new int[7];

String eventsubtitle []={
        "Subtitles",
        "of",
        "the",
        "events",
        "are",
        "present",
        "here"
};

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_events, null);

 arr[]={
            R.drawable.Logo,
            R.drawable.name,
            R.drawable.of,
            R.drawable.events,
            R.drawable.are,
            R.drawable.present,
            R.drawable.here
    };



    EventList adapter = new
            EventList(getActivity(), eventname, arr, eventsubtitle);
    //ListView lv = (ListView)rootView.
    listEvent=(ListView)view.findViewById(R.id.listEvent);
    listEvent.setAdapter(adapter);


    return view;
}
}
适配器:

package com.basil.victor;
import android.app.Activity;
import android.graphics.drawable.Drawable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

public class EventList extends ArrayAdapter<String>{

private final Activity context;
private final String[] title;
private final int[] banner;
private final String[] subtitle;
public EventList(Activity context,
                  String[] title, int[] banner, String[] subtitle) {
    super(context, R.layout.list_single, title);
    this.context = context;
    this.title = title;
    this.banner = banner;
    this.subtitle = subtitle;

}
@Override
public View getView(int position, View view, ViewGroup parent) {
    LayoutInflater inflater = context.getLayoutInflater();
    View rowView= inflater.inflate(R.layout.event_row, null, true);

    TextView txtTitle = (TextView) rowView.findViewById(R.id.event_title);
    ImageView imageView = (ImageView) rowView.findViewById(R.id.event_banner);
    TextView subTitle = (TextView) rowView.findViewById(R.id.event_subtitle);


    txtTitle.setText(title[position]);
imageView.setImageResource((banner[position]);
    subTitle.setText(subtitle[position]);


    return rowView;
}
}
package com.basil.victor;
导入android.app.Activity;
导入android.graphics.drawable.drawable;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.ArrayAdapter;
导入android.widget.ImageView;
导入android.widget.TextView;
公共类事件列表扩展了ArrayAdapter{
私人最终活动背景;
私有最终字符串[]标题;
私人最终int[]横幅;
私有最终字符串[]副标题;
公共事件列表(活动上下文、,
字符串[]标题,int[]横幅,字符串[]副标题){
超级(上下文、右布局、列表、标题);
this.context=上下文;
this.title=标题;
this.banner=横幅;
this.subtitle=副标题;
}
@凌驾
公共视图getView(内部位置、视图视图、视图组父视图){
LayoutInflater充气器=上下文。getLayoutInflater();
视图行视图=充气机。充气(R.layout.event_行,null,true);
TextView txtTitle=(TextView)rowView.findViewById(R.id.event_title);
ImageView ImageView=(ImageView)rowView.findViewById(R.id.event_banner);
TextView subTitle=(TextView)rowView.findViewById(R.id.event\u subTitle);
setText(头衔[职位]);
setImageResource((横幅[位置]);
subTitle.setText(副标题[位置]);
返回行视图;
}
}
像这样做

class MainActivity extends AppCompatActivity {
private ListView listEvent;


String arras[]={
  "Logo",
    "name",
    "of",
    "events",
    "are",
    "present",
    "here"
};
Drawable[] arr=new Drawable[5];
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
            EventList adapter = new EventList(MainActivity.this, arras);
            //ListView lv = (ListView)rootView.
            listEvent=(ListView)findViewById(R.id.listEvent);
            listEvent.setAdapter(adapter);



        }
    }
适配器类是这样的

 public class EventList extends BaseAdapter {
LayoutInflater inflater;
private final Activity context;
String arras[];
public EventList(Activity context,String[] arras) {
    super();
    this.context = context;
    this.arras = arras;
    inflater = (LayoutInflater) this.context
            .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

}
@Override
public int getCount() {
    return arras.length;
}

@Override
public Object getItem(int position) {
    return arras.length;
}

@Override
public long getItemId(int position) {
    return position;
}
@Override
public View getView(int position, View myView, ViewGroup parent) {
    if (myView == null) {
        myView = inflater.inflate(R.layout.event_row, null, true);

    }

    ImageView imageView = (ImageView) myView.findViewById(R.id.event_banner);
    try {
        InputStream stream = context.getAssets().open(arras[position] + ".jpg");
        Drawable el = Drawable.createFromStream(stream, null);
        imageView.setImageDrawable(el);
    } catch (IOException e) {
        e.printStackTrace();
    }


    return myView;
}

}

如果您遇到
FileNotFound异常

  • 检查图像是否位于资源中的子文件夹内,并添加适当的路径

  • 检查扩展名的大小写(在我意识到我的图像有一个.JPG(大写)扩展名之前,我很长时间都面临这个问题)

  • 要搜索的最后一个字符串,请检查随机空白


  • 使用视窗夹

    ViewHolder通过缓存视图来加快列表视图的加载速度。如果它每次都通过调用findViewById()来查找视图,则速度会非常慢

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            ViewHolder holder; // to reference the child views for later actions
    
            if (v == null) {
                LayoutInflater vi =
                        (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.mainrow, null);
                // cache view fields into the holder
                holder = new ViewHolder();
                holder.ImageView = (ImageView) v.findViewById(R.id.event_banner);
                // associate the holder with the view for later lookup
                v.setTag(holder);
            } else {
                // view already exists, get the holder instance from the view
                holder = (ViewHolder) v.getTag();
            }
            // no local variables with findViewById here
    
            // use holder.ImageView where you were
            // using the local variable nameText before
            try {
                InputStream stream = context.getAssets().open(arras[position] + ".jpg");
                Drawable el = Drawable.createFromStream(stream, null);
                holder.ImageView.setImageDrawable(el);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return v;
        }
    
    // somewhere else in your class definition
    static class ViewHolder {
        ImageView imageView;
    }
    

    很可能是您没有正确读入它们,导致您传入了一个空数组。您是否在调试器中查看失败的地方?调试器显示:java.io.FileNotFoundException:Logo.jpg但它存在于资产文件夹中调试您的代码以获取异常。可能是由于名称错误或图像不可用导致应用程序崩溃或者,你可以这样做,我将传递一组可绘制id,并在图像视图上设置这些id否我想使用资源。因为我知道如何使用可绘制id,想尝试使用资源是的,它位于子文件夹横幅内。那么@Haran can u的路径是什么?谢谢。图像位于子文件夹内,所以我更改了一个输入流=getContext().getAssets().open(“banners/”+eventlogoname[i]+.jpg”);
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            View v = convertView;
            ViewHolder holder; // to reference the child views for later actions
    
            if (v == null) {
                LayoutInflater vi =
                        (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                v = vi.inflate(R.layout.mainrow, null);
                // cache view fields into the holder
                holder = new ViewHolder();
                holder.ImageView = (ImageView) v.findViewById(R.id.event_banner);
                // associate the holder with the view for later lookup
                v.setTag(holder);
            } else {
                // view already exists, get the holder instance from the view
                holder = (ViewHolder) v.getTag();
            }
            // no local variables with findViewById here
    
            // use holder.ImageView where you were
            // using the local variable nameText before
            try {
                InputStream stream = context.getAssets().open(arras[position] + ".jpg");
                Drawable el = Drawable.createFromStream(stream, null);
                holder.ImageView.setImageDrawable(el);
            } catch (IOException e) {
                e.printStackTrace();
            }
            return v;
        }
    
    // somewhere else in your class definition
    static class ViewHolder {
        ImageView imageView;
    }