用 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","requestedMethod":"searchPerson","requestedFormat":" 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 调用之前? HashMapLayoutInflater.from(context)
是一种选择,另一种是在适配器的getView
方法中使用父视图的上下文,例如LayoutInflater inflater = (LayoutInflater) parent.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
。跨度>
hmm 从 Kumulos 收到错误:"responseCode":32,"responseMessage":"Invalid request:","payload":null,"sessionToken":"5a5c1d1a52f955c248d05f632489f2e1445d2b0f","requestedMethod": "searchPerson","requestedFormat":"json","timestamp":1462208512,"requestReceivedTime":1462208512,"maxAllowedRequestTime":40,"requestProcessingTime":0.0094358921051025以上是关于用 Kumulos 填充 ListView?的主要内容,如果未能解决你的问题,请参考以下文章
我可以使用 Simpleadapter 和 hashmap 用嵌套数组填充 listView 吗?
Android 自定义 ListView onClickListener 返回 null
使用从 SQLite 概括的数据填充 RecyclerView/ListView