用 Kumulos 填充 ListView?

Posted

技术标签:

【中文标题】用 Kumulos 填充 ListView?【英文标题】:Populating a ListView with Kumulos? 【发布时间】:2016-08-21 03:44:06 【问题描述】:

我在使用 Kumulos 填充 ListView 时遇到了很多困难。通过我的研究,我发现了许多关于使用 SQLite 或其他数据库的教程和帖子,但没有使用 Kumulos =/。

我需要什么帮助:

1) 实现 Kumulos 填充 ListView

来源:https://docs.kumulos.com/integration/android/

进行的研究:

Encode and decode bitmap object in base64 string in Android

HashMap to ListView

How to retrieve data from DBHelper by HashMap in Multicolumn ListView

HashMap to ListView

主要活动:

public class PersonSearchPop extends Activity 

private ListView personlist;
private CustomListViewAdapter customListViewAdapter;
public static final String YOUR_API_KEY = "HIDDEN";
public static final String YOUR_SECRET_KEY = "HIDDEN";

public static String encodeToBase64(Bitmap image, Bitmap.CompressFormat compressFormat, int quality)

    ByteArrayOutputStream byteArrayOS = new ByteArrayOutputStream();
    image.compress(compressFormat, quality, byteArrayOS);
    return Base64.encodeToString(byteArrayOS.toByteArray(), Base64.DEFAULT);


public static Bitmap decodeBase64(String input)

    byte[] decodedBytes = Base64.decode(input, 0);
    return BitmapFactory.decodeByteArray(decodedBytes, 0, decodedBytes.length);



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

    Kumulos.initWithAPIKeyAndSecretKey(YOUR_API_KEY, YOUR_SECRET_KEY, this);

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);

    int width = dm.widthPixels;
    int height = dm.heightPixels;

    getWindow().setLayout((int) (width * .4), (int) (height * .6));

   ?????????????????????????????????????????????????????????????????????????????????


    personlist.setOnItemClickListener(new AdapterView.OnItemClickListener()
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id)
            finish();
        
    );

自定义适配器:

public class CustomListViewAdapter extends CursorAdapter 

public CustomListViewAdapter(Context context, Cursor c)
    super (context, c);


@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) 

    LayoutInflater inflater = LayoutInflater.from(parent.getContext());
    View retView = inflater.inflate(R.layout.personlist_row, parent, false);
    return retView;


@Override
public void bindView(View view, Context context, Cursor cursor) 

    TextView dl = (TextView) view.findViewById(R.id.tvdl);
    dl.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(7))));

    TextView last = (TextView) view.findViewById(R.id.tvLastName);
    last.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1))));

    TextView first = (TextView) view.findViewById(R.id.tvFirstName);
    first.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(3))));

    TextView middle = (TextView) view.findViewById(R.id.tvMiddleName);
    middle.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2))));

    TextView ss = (TextView) view.findViewById(R.id.tvSS);
    ss.setText(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(8))));

    //ImageView image = (ImageView) view.findViewById(R.id.idPic);
    //image.setImageDrawable(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(12))));

输入数据:

public class EnterData extends Activity 

EditText lName;
EditText dl;
EditText ss;

@Override
public void onCreate(Bundle savedInstanceState) 

    super.onCreate(savedInstanceState);
    setContentView(R.layout.persons_popup);

    lName = (EditText) findViewById(R.id.etLastName);
    dl = (EditText) findViewById(R.id.etDL);
    ss = (EditText) findViewById(R.id.etSocial);


public void onClickSearch (View btnSearch) 

    String personName = lName.getText().toString();
    String personDL = dl.getText().toString();
    String personSS = ss.getText().toString();

    

更新: 好的,我将代码更改为只有两个类,它似乎可以正常工作。然而,我从 Kumulos 那里得到一个错误 =/。

Kumulos 错误:"responseCode":32,"responseMessage":"无效请求:","payload":null,"sessionToken":"b29366e44a7cdbb905db18b51995e545daf4f816","re​​questedMethod":"searchPerson","re​​questedFormat":" json","timestamp":1462147387,"requestReceivedTime":1462147387,"maxAllowedRequestTime":40,"requestProcessingTime":0.012163877487183

PersonSearchPop:

public class PersonSearchPop extends ListActivity 

public static final String YOUR_API_KEY = "HIDDEN";
public static final String YOUR_SECRET_KEY = "HIDDEN";

static class Person 

    public long personID;
    public String lastName;
    public String middleName;
    public String firstName;
    public String dateOfBirth;
    public String personAddress;
    public int phoneNumber;
    public int driversLicense;
    public int socialSecurity;
    public String personRace;
    public String personSex;
    public String personAge;

    public static Person createFromGenericMap(Map<String, Object> object) 

        Person p = new Person();

        p.personID = (long) object.get("personID");
        p.lastName = (String) object.get("lastName");
        p.middleName = (String) object.get("middleName");
        p.firstName = (String) object.get("firstName");
        p.dateOfBirth = (String) object.get("dob");
        p.personAddress = (String) object.get("address");
        p.phoneNumber = (int) object.get("phone");
        p.driversLicense = (int) object.get("dl");
        p.socialSecurity = (int) object.get("ss");
        p.personRace = (String) object.get("race");
        p.personSex = (String) object.get("sex");
        p.personAge = (String) object.get("age");

        return p;
    



static class PersonAdapter extends BaseAdapter 

    private List<Person> people;

    public PersonAdapter(List<Person> people) 
        this.people = people;
        //inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    


    @Override
    public int getCount() 
        return people.size();
    

    @Override
    public Object getItem(int position) 
        return people.get(position);
    

    @Override
    public long getItemId(int position) 
        Person p = people.get(position);
        return p.personID;
    

    @Override
    public View getView(int position, View convertView, ViewGroup parent) 

        View view = convertView;

        if (convertView == null) 


            TextView dl = (TextView) view.findViewById(R.id.tvdl);
            TextView last = (TextView) view.findViewById(R.id.tvLastName);
            TextView first = (TextView) view.findViewById(R.id.tvFirstName);
            TextView middle = (TextView) view.findViewById(R.id.tvMiddleName);
            TextView ss = (TextView) view.findViewById(R.id.tvSS);

            Person mperson = people.get(position);

            dl.setText(mperson.driversLicense);
            last.setText(mperson.lastName);
            first.setText(mperson.firstName);
            middle.setText(mperson.middleName);
            ss.setText(mperson.socialSecurity);
            //ImageView image = (ImageView) view.findViewById(R.id.idPic);
            //image.setImageDrawable(cursor.getString(cursor.getColumnIndex(cursor.getColumnName(12))));
        
        return view;
    


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

    Kumulos.initWithAPIKeyAndSecretKey(YOUR_API_KEY, YOUR_SECRET_KEY, this);

    DisplayMetrics dm = new DisplayMetrics();
    getWindowManager().getDefaultDisplay().getMetrics(dm);

    int width = dm.widthPixels;
    int height = dm.heightPixels;

    getWindow().setLayout((int) (width * .4), (int) (height * .6));

    // Call Kumulos
    Map<String, String> params = new HashMap<>();
    Intent intent = getIntent();
    String lastName = intent.getStringExtra("lastName");
    params.put("lastName",String.valueOf(lastName));
    Kumulos.call("searchPerson", params, new ResponseHandler() 

        // Handle result
        @Override
        public void didCompleteWithResult(Object result) 
            super.didCompleteWithResult(result);

            // Cast generic response down to list of maps
            ArrayList<LinkedHashMap<String, Object>> objects = (ArrayList<LinkedHashMap<String, Object>>) result;

            // Create a list for the models
            ArrayList<Person> people = new ArrayList<>();

            // Map models from generic objects and add to list
            for (Map<String, Object> personObject : objects) 
                Person p = Person.createFromGenericMap(personObject);
                people.add(p);
            

            // Create adapter with model list
            final PersonAdapter adapter = new PersonAdapter(people);

            // Set adapter on main UI thread
            runOnUiThread(new Runnable() 
                @Override
                public void run() 
                    setListAdapter(adapter);
                
            );
        
    );

人物流行

 @Override
public void onClick(View v)
    switch(v.getId())
        case R.id.bCancelPerson:
            finish();
            break;
        case R.id.bSearchPerson:
            EditText lastName = (EditText) findViewById(R.id.etLastName);
            Intent intent = new Intent(PersonsPop.this, PersonSearchPop.class);
            intent.putExtra("lastName", lastName.getText().toString());
            startActivity(new Intent(PersonsPop.this, PersonSearchPop.class));

【问题讨论】:

【参考方案1】:

我是来自 Kumulos 的 Chris -- 让我试着为你指明正确的方向。

因此,一般来说,从 Web 服务在列表视图中显示数据的过程如下所示:

    调用 Web 服务并检索数据列表

    将这些对象映射到模型类并保存在内存中或保存到磁盘

    创建一个由手机数据支持的适配器

    将列表视图的适配器设置为您的自定义适配器实例

假设您将对象保存在内存中,创建一个由您的模型类型的ArrayList 支持的自定义适配器就足够了。这是最简单的入门方法之一。

因此,使用 Kumulos,您可以执行以下操作:

package com.example.cgwyllie.simplelistview;

import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;

import com.kumulos.android.jsonclient.Kumulos;
import com.kumulos.android.jsonclient.ResponseHandler;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends ListActivity 

    static class Person 

        public long personID;
        public String firstName;
        public String lastName;

        public static Person createFromGenericMap(Map<String, Object> object) 
            Person p = new Person();

            p.personID = (long) object.get("personID");
            p.firstName = (String) object.get("firstName");
            p.lastName = (String) object.get("lastName");

            return p;
        

    

    static class PersonAdapter extends BaseAdapter 

        private List<Person> people;

        public PersonAdapter(List<Person> people) 
            this.people = people;
        

        @Override
        public int getCount() 
            return people.size();
        

        @Override
        public Object getItem(int position) 
            return people.get(position);
        

        @Override
        public long getItemId(int position) 
            Person p = people.get(position);
            return p.personID;
        

        @Override
        public View getView(int position, View convertView, ViewGroup parent) 
            // TODO implement your view
            return null;
        

    

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        Kumulos.initWithAPIKeyAndSecretKey("API_KEY", "SECRET_KEY", this);

        // Call Kumulos
        Map<String,String> params = new HashMap<>();
        Kumulos.call("getPeople", params, new ResponseHandler() 

            // Handle result
            @Override
            public void didCompleteWithResult(Object result) 
                super.didCompleteWithResult(result);

                // Cast generic response down to list of maps
                ArrayList<LinkedHashMap<String, Object>> objects = (ArrayList<LinkedHashMap<String,Object>>) result;

                // Create a list for the models
                ArrayList<Person> people = new ArrayList<>();

                // Map models from generic objects and add to list
                for (Map<String,Object> personObject : objects) 
                    Person p = Person.createFromGenericMap(personObject);
                    people.add(p);
                

                // Create adapter with model list
                final PersonAdapter adapter = new PersonAdapter(people);

                // Set adapter on main UI thread
                runOnUiThread(new Runnable() 
                    @Override
                    public void run() 
                        setListAdapter(adapter);
                    
                );
            
        );
    

如前所述,虽然这是最简单的方法之一,但它在处理方向变化或在加载时远离活动的导航方面确实存在一些限制。也没有涉及使用回收实现视图。

有关更全面的列表视图示例,可能值得查看 http://developer.android.com/training/material/lists-cards.html 和 http://www.vogella.com/tutorials/AndroidListView/article.html。

希望这对您有所帮助。

【讨论】:

好的,所以如果我只想拉取名为 Johnson 的人。我是否只是设置用户在编辑文本中输入的内容并将其放在 Kumulos 调用之前? HashMap 参数 = new HashMap(); params.put("lastName", String.valueOf(personName)); 是的,可以。然后将修改服务器端 API 以返回匹配过滤器的结果。或者,您可以在客户端应用过滤。取决于您的记录数量,如果您想要分页等。 您没有使用充气器进行视图吗?我将 public PersonAdapter(List people) 更改为 public PersonAdapter(Context context, List people) 以调用充气机。你会怎么称呼这个视图? 是的,将上下文传递给构造函数并使用LayoutInflater.from(context)是一种选择,另一种是在适配器的getView方法中使用父视图的上下文,例如LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);。跨度> hmm 从 Kumulos 收到错误:"responseCode":32,"responseMessage":"Invalid request:","payload":null,"sessionToken":"5a5c1d1a52f955c248d05f632489f2e1445d2b0f","re​​questedMethod": "searchPerson","re​​questedFormat":"json","timestamp":1462208512,"requestReceivedTime":1462208512,"maxAllowedRequestTime":40,"requestProcessingTime":0.0094358921051025

以上是关于用 Kumulos 填充 ListView?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Simpleadapter 和 hashmap 用嵌套数组填充 listView 吗?

Android 自定义 ListView onClickListener 返回 null

使用从 SQLite 概括的数据填充 RecyclerView/ListView

如何设置 ListView 项目单击使用开关位置在单独类的视频视图中每行播放一个本地视频文件?

android listview 怎么添加数据

如何在app小部件中使用ListView并在android中填充数据?