Android Custom ArrayAdapter does not take an array

泪湿孤枕 提交于 2019-12-24 14:20:14

问题


I correctly fill an array? NewsData_data cannot be resolved to a variable.

    NewsData NewsData_data[] = new NewsData[]
                {
                    new NewsData(header[i], short_text[i], team[i], datatime[i], photo_url[i])
                };

Problem in:

     NewsDataAdapter adapter = new NewsDataAdapter(this, 
                        R.layout.news_details, NewsData_data);

NewsData_data cannot be resolved to a variable. How to fix this error?

    public void ListDrwaer() { 
            String[] header;
            String[] short_text;
            String[] team;
            String[] datatime;
            String[] photo_url;
      try {
       JSONObject jsonResponse = new JSONObject(jsonResult);
       JSONArray jsonMainNode = jsonResponse.optJSONArray("news");
       for (int i = 0; i < jsonMainNode.length(); i++) {
        JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
        header[i] = jsonChildNode.optString("header");
        short_text[i] = jsonChildNode.optString("short_text");
        team[i] = jsonChildNode.optString("team");
        datatime[i] = jsonChildNode.optString("datatime");
        photo_url[i] = jsonChildNode.optString("photo_url");    

        NewsData NewsData_data[] = new NewsData[]
                {
                    new NewsData(header[i], short_text[i], team[i], datatime[i], photo_url[i])
                };      
       }
      } catch (JSONException e) {
       Toast.makeText(getActivity(), "Error" + e.toString(),
         Toast.LENGTH_SHORT).show();
      }

NewsDataAdapter adapter = new NewsDataAdapter(this, 
                        R.layout.news_details, NewsData_data);
      View header1 = getActivity().getLayoutInflater().inflate(R.layout.news_details, null);
                listView.addHeaderView(header1);                    
                listView.setAdapter(adapter);
     }

     public class NewsData {
            public String header;
            public String short_text;
            public String team;
            public String datatime;
            public String photo_url;
            public NewsData(){
                super();
            }

            public NewsData(String header,
                        String short_text,
                        String team,
                        String datatime,
                        String photo_url) {
                super();
                this.header = header;
                this.short_text = short_text;
                this.team = team;
                this.datatime = datatime;
                this.photo_url = photo_url;
            }
        }

     public class NewsDataAdapter extends ArrayAdapter<NewsData>{

            Context context; 
            int layoutResourceId;    
            NewsData data[] = null;

            public NewsDataAdapter(Context context, int layoutResourceId, NewsData[] 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;
                NewsDataHolder holder = null;

                if(row == null)
                {
                    LayoutInflater inflater = ((Activity)context).getLayoutInflater();
                    row = inflater.inflate(layoutResourceId, parent, false);

                    holder = new NewsDataHolder();
                    holder.img_news = (ImageView)row.findViewById(R.id.img_news);
                    holder.header = (TextView)row.findViewById(R.id.header);
                    holder.short_text = (TextView)row.findViewById(R.id.short_text);
                    holder.team = (TextView)row.findViewById(R.id.team);
                    holder.datatime = (TextView)row.findViewById(R.id.datatime);

                    row.setTag(holder);
                }
                else
                {
                    holder = (NewsDataHolder)row.getTag();
                }       
                NewsData NewsData = data[position];                 
                Picasso.with(context).load(NewsData.photo_url).into(holder.img_news);
                holder.header.setText(NewsData.header);
                holder.short_text.setText(NewsData.short_text);
                holder.team.setText(NewsData.team);
                holder.datatime.setText(NewsData.datatime);                 
                return row;
            }

             class NewsDataHolder
            {
                ImageView img_news;
                TextView header;
                TextView short_text;
                TextView team;
                TextView datatime;
            }
        }

Problem in:

     NewsDataAdapter adapter = new NewsDataAdapter(this, 
                        R.layout.news_details, NewsData_data);

NewsData_data cannot be resolved to a variable


回答1:


You need to declare your array outside of the try block so that it is visible to the ArrayAdapter constructor.




回答2:


As corsair922 mentioned, you'll want to declare your NewsData_data array outside your try catch block, otherwise you won't have access to it from outside the block. Additionally, you want to initialize your array once, and populate the array elements as you go as opposed to reinitializing your array each time:

Edit, I would also recommend you spend some time getting familiar with the Java coding conventions. They will make your code easier to maintain/tidier and will allow other people to better understand your code (http://www.oracle.com/technetwork/java/codeconv-138413.html).

public void ListDrwaer() {
    String[] header;
    String[] short_text;
    String[] team;
    String[] datatime;
    String[] photo_url;

    NewsData NewsData_data[];

    try {
        JSONObject jsonResponse = new JSONObject(jsonResult);
        JSONArray jsonMainNode = jsonResponse.optJSONArray("news");
        NewsData_data = new NewsData[jsonMainNode.length()];
        for (int i = 0; i < jsonMainNode.length(); i++) {
            JSONObject jsonChildNode = jsonMainNode.getJSONObject(i);
            header[i] = jsonChildNode.optString("header");
            short_text[i] = jsonChildNode.optString("short_text");
            team[i] = jsonChildNode.optString("team");
            datatime[i] = jsonChildNode.optString("datatime");
            photo_url[i] = jsonChildNode.optString("photo_url");

            NewsData_data[i] = new NewsData(header[i], short_text[i], team[i], datatime[i], photo_url[i]);
        }
    } catch (JSONException e) {
        Toast.makeText(getActivity(), "Error" + e.toString(), Toast.LENGTH_SHORT).show();
    }

    NewsDataAdapter adapter = new NewsDataAdapter(this, R.layout.news_details, NewsData_data);
    View header1 = getActivity().getLayoutInflater().inflate(R.layout.news_details, null);
    listView.addHeaderView(header1);
    listView.setAdapter(adapter);
}


来源:https://stackoverflow.com/questions/20894978/android-custom-arrayadapter-does-not-take-an-array

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!