【问题标题】:Pull values from nested arrays从嵌套数组中提取值
【发布时间】:2016-03-09 16:35:10
【问题描述】:

我有一个名为社团的数组:

List<Society> societies = new ArrayList<>();

其中包含以下数据:

[{"society_id":1,"name":"TestName1","email":"Test@email1","description":"TestDes‌​1"},
{"society_id":2,"name":"TestName2","email":"Test@email2","description":"TestD‌​es2"},
{"society_id":3,"name":"TestName3","email":"Test@email3","description":"Tes‌​tDes3"}}

我将使用它来填充 ListView,但在编写将每个值数组分配到 ListView 中的位置的循环时遇到问题。 我想找到一种方法从数组中提取值并使用循环将它们分配给每个列表项,有人可以帮我吗?

我的代码(应该足够了,但如果您需要查看更多请询问):

public class SocietySearch extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_society_search);


        List<Society> societies = new ArrayList<>();
        ServerRequests serverRequest1 = new ServerRequests(SocietySearch.this);
        serverRequest1.GetSocietyDataAsyncTask(societies, new GetSocietyCallback() {
            @Override
            public void done(List<Society> societies) {
                ListView lv = (ListView) findViewById(R.id.ListView);
                List<ListViewItem> items = new ArrayList<>();

                items.add(new ListViewItem() {{
                    ThumbnailResource = R.drawable.test;
                    Title = societies.socName;
                    Subtitle = societies.socDes;
                }});

                CustomListViewAdapter adapter = new CustomListViewAdapter(SocietySearch.this, items);
                lv.setAdapter(adapter);
            }
        });
    }


    class ListViewItem {
        public int ThumbnailResource;
        public String Title;
        public String Subtitle;
    } 

适配器类:

public class CustomListViewAdapter extends ArrayAdapter {

    LayoutInflater inflater;
    List<SocietySearch.ListViewItem> items;

    public CustomListViewAdapter(Activity context, List<SocietySearch.ListViewItem> items) {
        super(context, R.layout.item_row);

        this.items = items;
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        //Auto-generated method stub

        ListViewItem item = items.get(position);

        View vi = convertView;

        if (convertView == null)
            vi = inflater.inflate(R.layout.item_row, null);

        ImageView test = (ImageView) vi.findViewById(R.id.imgThumbnail);
        TextView txtTitle = (TextView) vi.findViewById(R.id.txtTitle);
        TextView txtSubTitle = (TextView) vi.findViewById(R.id.txtSubTitle);

        test.setImageResource(item.ThumbnailResource);
        txtTitle.setText(item.Title);
        txtSubTitle.setText(item.Subtitle);


        return vi;
    }
}

【问题讨论】:

    标签: java android arrays json loops


    【解决方案1】:

    所以我们得出结论,我们需要有 for 循环来遍历 SocietySearch 类中的所有 Society 类:

    @Override
    public void done(List<Society> societies) {
        ListView lv = (ListView) findViewById(R.id.ListView);
        List<ListViewItem> items = new ArrayList<>();
        for(Society s : societies) {
            items.add(new ListViewItem() {{
                ThumbnailResource = R.drawable.test;
                Title = s.socName;
                Subtitle = s.socDes;
            }});
        }
        CustomListViewAdapter adapter = new CustomListViewAdapter(
            SocietySearch.this, items);
        lv.setAdapter(adapter);
    }`
    

    我们还必须修复 ArrayAdapter 的实现:

    public class CustomListViewAdapter extends ArrayAdapter {
    
        LayoutInflater inflater;
        List<SocietySearch.ListViewItem> items;
    
        public CustomListViewAdapter(Activity context, List<SocietySearch.ListViewItem> items) {
            super(context, R.layout.item_row, **items**); // the constructor 
            //needs the reference of the list, even though we use our variable to 
            //populate the rows. I guess it has to know how many elements it contains to
            //iterate then through getView method, which is called for each row
    
            this.items = items;
            this.inflater = (LayoutInflater) context.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);
        }
    

    【讨论】:

      【解决方案2】:

      您在寻找定制解决方案吗?这样您就可以将每个 ListViewItem 状态绑定到相应的列,然后您必须像 here 一样创建自定义解决方案。您需要为每一行自定义布局并扩展 ArrayAdapter,您可以在其中为一行绑定每一列。

      这是你想知道的吗?如果没有,请您说的更具体些。

      【讨论】:

      • 我已经有了适配器,我想找到一种方法从数组中提取值并使用循环将它们分配给每个列表项。我已经添加了自定义适配器供您查看。
      • 你想要这个for(Society s : societies) {items.add(new ListViewItem() {{ ThumbnailResource = R.drawable.test; Title = societies.socName; Subtitle = societies.socDes; }}); }
      • 您有一个列表 societies (@Override public void done(List&lt;Society&gt; societies)),但您在异步任务中只为其分配了一个值。然后列表只包含一个值。而当你为每一行绑定项目时(@Override public View getView(..){}),列表只包含1个项目,等于一行。
      • 是的,因为您调用了Subtitle = societies.socDes;。只需将 societies.socDes 交换为 s.socDes。您不能调用它,因为您的实例是List&lt;Society&gt; societies。列表没有这种状态。你甚至应该在这里得到一个错误Title = societies.socName;。您不能在 List 类中调用 Society 状态,您必须将实例从列表中取出。就像我写给你的 for 循环:for(Society s : societies) {items.add(new ListViewItem() {{ ThumbnailResource = R.drawable.test; Title = s.socName; Subtitle = s.socDes; }}); }.
      • 顺便说一句,使用私有变量和公共方法隐藏类的状态是一种很好的方法 - encapsulation
      【解决方案3】:

      您正在创建一个匿名类并尝试在它的对象初始化程序中分配值。对象初始化程序没有对societies 的引用,这就是您收到编译错误的原因。试试这个:

      class ListViewItem {
          private final int ThumbnailResource;
          private final String Title;
          private final String Subtitle;
      
          public ListViewItem(int thumbnail, String title, String subtitle) {
              ThumbnailResource = thumbnail;
              Title = title;
              Subtitle = subtitle;
          }
      } 
      

      添加列表项时:

      items.add(new ListViewItem(R.drawable.test, societies.socName, societies.socDes);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多