Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android ListView显示从URL获取的图像的错误位置_Android_Android Layout_Android Listview_Android Adapter - Fatal编程技术网

Android ListView显示从URL获取的图像的错误位置

Android ListView显示从URL获取的图像的错误位置,android,android-layout,android-listview,android-adapter,Android,Android Layout,Android Listview,Android Adapter,我的listview没有显示图像在其单个自定义适配器上的确切位置。我正在尝试使用AsyncTask加载图像。有时图像会重复,我不知道为什么。这是我的ArrayAdapter代码: public class NewsPromoAdapter extends ArrayAdapter<NewsPromosDTO> { private final Context context; List<NewsPromosDTO> npList; LayoutInf

我的listview没有显示图像在其单个自定义适配器上的确切位置。我正在尝试使用AsyncTask加载图像。有时图像会重复,我不知道为什么。这是我的ArrayAdapter代码:

public class NewsPromoAdapter extends ArrayAdapter<NewsPromosDTO> {
    private final Context context;
    List<NewsPromosDTO> npList;
    LayoutInflater inflater;
    Bitmap src;

    public NewsPromoAdapter(Context context, List<NewsPromosDTO> npList) {
        super(context, R.layout.news_and_promos, npList);
        this.context = context;
        this.npList = npList;
        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    public static class ViewHolder {
        TextView nameText;
        TextView date1Text;
        ImageView imageView;
        ProgressBar prg;
        LoadImage loadImg;
    }

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

        if (convertView == null) {
            convertView = inflater.inflate(R.layout.news_and_promos, parent,
                    false);
            holder = new ViewHolder();
            holder.nameText = (TextView) convertView
                    .findViewById(R.id.newspromo_name);
            holder.date1Text = (TextView) convertView
                    .findViewById(R.id.newspromo_date);
            holder.imageView = (ImageView) convertView
                    .findViewById(R.id.newspromo_imageView);
            holder.prg = (ProgressBar) convertView
                    .findViewById(R.id.progressBar1);

            convertView.setTag(holder);
        } else {

            holder = (ViewHolder) convertView.getTag();
            holder.loadImg.cancel(true);
        }

        if (!(npList.get(position).getName().equals(""))) {
            holder.nameText.setVisibility(View.VISIBLE);
            holder.nameText.setText(npList.get(position).getName());

        } else {
            holder.nameText.setVisibility(View.GONE);
        }

        if (!(npList.get(position).getDate().equals(""))) {
            holder.date1Text.setVisibility(View.VISIBLE);
            holder.date1Text.setText(npList.get(position).getDate());

        } else {
            holder.date1Text.setVisibility(View.GONE);
        }

        if (!(npList.get(position).getImageURL().equals(""))) {
            holder.imageView.setVisibility(View.VISIBLE);
            holder.loadImg = new LoadImage(holder.imageView, npList.get(
                    position).getImageURL(), holder);
            holder.loadImg.execute();
        } else {
            holder.imageView.setVisibility(View.GONE);
            holder.prg.setVisibility(View.GONE);
        }

        return convertView;
    }

    class LoadImage extends AsyncTask<Object, Void, Bitmap> {
        ViewHolder viewH;
        private ImageView imv;
        private String url;

        public LoadImage(ImageView imv, String imageURL, ViewHolder viewH) {
            this.imv = imv;
            this.url = imageURL;
            this.viewH = viewH;

        }

        @Override
        protected Bitmap doInBackground(Object... params) {
            BitmapFromURL bmpURL = new BitmapFromURL();
            src = bmpURL.getBitmapFromURL(url);

            return src;
        }

        @Override
        protected void onPostExecute(Bitmap result) {

            // imv.setImageBitmap(result);
            // viewH.prg.setVisibility(View.GONE);
            viewH.prg.setVisibility(View.GONE);

            imv.setImageBitmap(result);

        }
    }

}
公共类NewsPromoAdapter扩展了ArrayAdapter{
私人最终语境;
名单;
充气机;
位图src;
公共NewsPromoAdapter(上下文,列表npList){
超级(上下文、右布局、新闻和宣传片、npList);
this.context=上下文;
this.npList=npList;
充气器=(充气器)上下文
.getSystemService(上下文布局\充气机\服务);
}
公共静态类视图持有者{
文本视图名称文本;
text查看日期1文本;
图像视图图像视图;
ProgressBar prg;
LoadImage-loadImg;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视窗座;
if(convertView==null){
convertView=充气机。充气(R.layout.news和promos,父级,
假);
holder=新的ViewHolder();
holder.nameText=(TextView)convertView
.findviewbyd(R.id.newspromo_name);
holder.date1Text=(TextView)convertView
.findviewbyd(R.id.newspromo_日期);
holder.imageView=(imageView)convertView
.findviewbyd(R.id.newspromo_imageView);
holder.prg=(ProgressBar)convertView
.findViewById(R.id.progressBar1);
convertView.setTag(支架);
}否则{
holder=(ViewHolder)convertView.getTag();
holder.loadImg.cancel(真);
}
if(!(npList.get(position.getName().equals(“”)){
holder.nameText.setVisibility(View.VISIBLE);
holder.nameText.setText(npList.get(position.getName());
}否则{
holder.nameText.setVisibility(View.GONE);
}
如果(!(npList.get(position.getDate().equals(“”)){
holder.date1Text.setVisibility(View.VISIBLE);
holder.date1Text.setText(npList.get(position.getDate());
}否则{
holder.date1Text.setVisibility(View.GONE);
}
if(!(npList.get(position.getImageURL().equals(“”)){
holder.imageView.setVisibility(View.VISIBLE);
holder.loadImg=新的LoadImage(holder.imageView,npList.get(
位置);
holder.loadImg.execute();
}否则{
holder.imageView.setVisibility(View.GONE);
保持架.prg.设置可见性(视图.消失);
}
返回视图;
}
类LoadImage扩展了异步任务{
持票人viewH;
私有ImageView imv;
私有字符串url;
公共加载映像(ImageView imv、字符串imageURL、ViewHolder viewH){
this.imv=imv;
this.url=imageURL;
this.viewH=viewH;
}
@凌驾
受保护位图doInBackground(对象…参数){
BitmapFromURL bmpURL=新的BitmapFromURL();
src=bmpURL.getBitmapFromURL(url);
返回src;
}
@凌驾
受保护的void onPostExecute(位图结果){
//imv.setImageBitmap(结果);
//viewH.prg.SETVISION(View.GONE);
viewH.prg.SETVISION(View.GONE);
imv.setImageBitmap(结果);
}
}
}
下面是处理适配器的活动。我正在实现一些大型网站使用的无休止的listview方法。如Facebook、Twitter等。滚动到底部时,会将新项目加载到listview中。我不确定我是否做得很好

public class ListNewsPromoActivity extends Activity {

    List<NewsPromosDTO> npList;
    String url, user_email;
    Bundle extras;
    int user_points;
    List<Integer> npIDs;
    private ProgressDialog progressDialog;
    BitmapFromURL bmpURL;
    JSONArray users = null;

    String TAG_ID = "id";
    String TAG_NAME = "name";
    String TAG_PHOTO = "photo";
    String TAG_DATE = "date";
    String TAG_DESC = "description";
    ListView list;
    NewsPromoAdapter newsAdapter;

    boolean loadingMore = false;
    private Runnable returnRes;
    int itemsPerPage = 3;
    int currentIndex = 0;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.news_promo_listview);
        list = (ListView) findViewById(R.id.mainView);
        extras = getIntent().getExtras();
        if (extras != null) {

            user_points = extras.getInt("user_points");
            user_email = extras.getString("user_email");
        }
        url = getString(R.string.app_url_news_promos);
        npIDs = new ArrayList<Integer>();
        npList = new ArrayList<NewsPromosDTO>();


        View footerView = ((LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.footer, null, false);

        newsAdapter = new NewsPromoAdapter(ListNewsPromoActivity.this, npList);

        list.addFooterView(footerView);
        list.setAdapter(newsAdapter);

        list.setOnScrollListener(new OnScrollListener() {
            // useless here, skip!
            @Override
            public void onScrollStateChanged(AbsListView view, int scrollState) {
            }

            @Override
            public void onScroll(AbsListView view, int firstVisibleItem,
                    int visibleItemCount, int totalItemCount) {
                // what is the bottom item that is visible
                int lastInScreen = firstVisibleItem + visibleItemCount;
                // is the bottom item visible & not loading more already ? Load
                if ((lastInScreen == totalItemCount) && !(loadingMore)) {
                    Thread thread = new Thread(null, getRunnable());
                    thread.start();

                }
            }
        });

        // Runnable to load the items
        // Since we cant update our UI from a thread this Runnable takes care of
        // that!
        returnRes = new Runnable() {
            @Override
            public void run() {

                // Loop thru the new items and add them to the adapter

                for (NewsPromosDTO np : npList) {
                    System.out.println(np.getName() + " andito ako!!");
                    newsAdapter.add(np);
                }

                newsAdapter.notifyDataSetChanged();


                              // Done loading more.
                loadingMore = false;
            }
        };

    }

    protected class loadNewsPromo extends AsyncTask<Void, Void, String> {

        @Override
        protected void onPreExecute() {

            super.onPreExecute();

        }

        protected String doInBackground(Void... params) {
            // Creating JSON Parser instance

            loadingMore = true;
            JSONParser jParser = new JSONParser();
            JSONObject json;

            if (jParser.checkServer(url)) {
                try {
                    // Getting Array of UserNews
                    json = jParser.getJSONFromUrl(url);
                    users = json.getJSONArray(user_email);
                    // looping through All UserNews

                    for (int i = currentIndex; i < itemsPerPage; i++) {
                        if (itemsPerPage == i) {
                            // currentIndex--;
                            break;
                        } else {
                            JSONObject c = users.getJSONObject(i);
                            // Storing each json item in variable
                            NewsPromosDTO npDTO = new NewsPromosDTO();

                            npDTO.setImageURL(c.getString(TAG_PHOTO));
                            npDTO.setId(c.getInt(TAG_ID));
                            npDTO.setName(c.getString(TAG_NAME));
                            npDTO.setDate(c.getString(TAG_DATE));
                            npDTO.setDescription(c.getString(TAG_DESC));
                            npList.add(npDTO);
                            currentIndex++;
                        }

                    }

                } catch (JSONException e) {
                    e.printStackTrace();
                    return null;
                } finally {

                }
            } 
            }

            return null;
        }

        @Override
        protected void onPostExecute(String result) { //
            // progressDialog.dismiss();
            loadingMore = false;
            list();
        }
    }

    public void list() {
        // add the footer before adding the adapter, else the footer will not
        // load!
        View footerView = ((LayoutInflater) this
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE)).inflate(
                R.layout.footer, null, false);

        newsAdapter = new NewsPromoAdapter(ListNewsPromoActivity.this, npList);

        list.addFooterView(footerView);
        list.setAdapter(newsAdapter);
    }



    public Runnable getRunnable() {
        Runnable loadMoreListItems = new Runnable() {
            @Override
            public void run() {
                // Set flag so we cant load new items 2 at the same time
                loadingMore = true;
                // Reset the array that holds the new items

                // Simulate a delay, delete this on a production environment!
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                }
                // Get 15 new listitems
                JSONParser jParser = new JSONParser();
                JSONObject json;
                npList = new ArrayList<NewsPromosDTO>();
                if (jParser.checkServer(url)) {
                    try {
                        // Getting Array of Contacts
                        json = jParser.getJSONFromUrl(url);
                        users = json.getJSONArray(user_email);
                        // looping through All Contacts

                        // if (itemsPerPage > users.length() - currentIndex) {
                        // itemsPerPage = users.length();
                        // }
                        npList = new ArrayList<NewsPromosDTO>();
                        System.out.println(users.length() + " Laman ng users");
                        int counter = 0;
                        for (int i = currentIndex; i < users.length(); i++) {

                            if (itemsPerPage == counter) {

                                break;
                            } else {
                                JSONObject c = users.getJSONObject(i);
                                // Storing each json item in variable
                                NewsPromosDTO npDTO = new NewsPromosDTO();

                                npDTO.setImageURL(c.getString(TAG_PHOTO));
                                npDTO.setId(c.getInt(TAG_ID));
                                npDTO.setName(c.getString(TAG_NAME));
                                npDTO.setDate(c.getString(TAG_DATE));
                                npDTO.setDescription(c.getString(TAG_DESC));
                                npList.add(npDTO);
                                currentIndex++;
                            }
                            counter++;
                        }

                    } catch (JSONException e) {
                        e.printStackTrace();

                    } finally {

                    }
                }
                // Done! now continue on the UI thread
                runOnUiThread(returnRes);
            }
        };

        return loadMoreListItems;

    }

}
公共类ListNewsPromoActivity扩展活动{
名单;
字符串url,用户\电子邮件;
捆绑附加;
int用户点;
列出NPID;
私有进程对话;
BitmapFromURL bmpURL;
JSONArray用户=null;
字符串标记_ID=“ID”;
String TAG_NAME=“NAME”;
字符串TAG_PHOTO=“PHOTO”;
字符串TAG_DATE=“DATE”;
String TAG_DESC=“description”;
列表视图列表;
新闻适配器;
boolean loadingMore=false;
私人可运行的返回;
int itemsPerPage=3;
int currentIndex=0;
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
requestWindowFeature(窗口。功能\u无\u标题);
setContentView(R.layout.news\u promo\u listview);
list=(ListView)findViewById(R.id.mainView);
extras=getIntent().getExtras();
如果(附加值!=null){
user_points=extras.getInt(“user_points”);
user_email=extras.getString(“user_email”);
}
url=getString(R.string.app\uURL\uNews\uPromos);
npIDs=新的ArrayList();
npList=newarraylist();
视图页脚视图=((LayoutFlater)此
.getSystemService(Context.LAYOUT\u filler\u SERVICE)).充气(
R.layout.footer,null,false);
newsAdapter=NewsPromoAdapter(ListNewsPromoActivity.this,npList);
list.addFooterView(footerView);
list.setAdapter(newsAdapter);
setOnScrollListener(新的OnScrollListener(){
//这里没用,斯基普!
@凌驾
公共无效onScrollStateChanged(AbsListView视图,int scrollState){
}
@凌驾
public void onScroll(AbsListView视图,int firstVisibleItem,
int visibleItemCount,int totalItemCount){
//可见的底部项目是什么
int lastInScreen=firstVisibleItem+visibleItemCount;
//底部项目是否可见&尚未加载更多?加载
如果((lastInScreen==总计