[英]How to set data to custom row TextView in ListView
我想在自定義ListView中顯示從服務器獲取的數據
這是我的自定義行的row_category.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/imageView1"
android:layout_width="80dp"
android:layout_height="80dp"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:src="@drawable/messenger_bubble_large_blue" />
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_marginLeft="10dp" >
<TextView
android:id="@+id/txtTitle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textColor="#ffffff"
android:text="Large Text"
android:textAppearance="?android:attr/textAppearanceLarge" />
</LinearLayout>
</LinearLayout>
我的CategoryAdapter.java
public class CategoryAdapter extends ArrayAdapter{
private LayoutInflater inflater;
public CategoryAdapter(Activity activity, ArrayList<Category> items){
super(activity, R.layout.row_category, items);
inflater = activity.getWindow().getLayoutInflater();
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
return inflater.inflate(R.layout.row_category, parent, false);
}
}
我的Category.java類
public class Category {
private String name,url;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getUrl() {
return url;
}
public void setUrl(String url) {
this.url = url;
}
}
和我與listview的主要活動
private ListView categorylist;
private CategoryAdapter categoryitemadapter;
private Intent intent;
JSONArray jArray;
ArrayList<Category> list;
String uri="http://demopurpose.com/Quiz/API/";
InputStream is;
JSONObject json_data;
int len;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_categories);
list = new ArrayList<Category>();
categoryitemadapter = new CategoryAdapter(this, list);
getdata();
setListAdapter(categoryitemadapter);
categoryitemadapter.notifyDataSetChanged();
}
public void getdata(){
Thread t = new Thread() {
public void run() {
getdeals();
}
};
t.start();
}
public void getdeals() {
String result = "";
try{
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(uri+"getcategories.php");
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
is = entity.getContent();
}
catch(Exception e){
Log.e("log_tag", "Error in http connection "+e.toString());
}
//convert response to string
try{
BufferedReader reader = new BufferedReader(new InputStreamReader(is,"iso-8859-1"),8);
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = reader.readLine()) != null) {
sb.append(line + "\n");
}
is.close();
result=sb.toString();
Log.i("result...",result);
}catch(Exception e){
Log.e("log_tag", "Error converting result "+e.toString());
}
//parse json data
try{
jArray = new JSONArray(result);
//Log.i("result", result);
len=jArray.length();
runOnUiThread(new Runnable() {
public void run() {
try{
Category c = new Category();
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
c.setName(json_data.getString("name"));
list.add(c);
categoryitemadapter.notifyDataSetChanged();
}
}
catch(JSONException je){
je.printStackTrace();
}
}
});
}
catch(JSONException e){
Log.e("log_tag", "Error parsing data "+e.toString());
}
}
當我從響應中獲得它時它正在生成具有3項的列表 現在,我如何更改每個ListView行的文本。
在CategoryAdapter.java
類中,將getView
函數更改為:
@Override
public View getView(int position, View convertView, ViewGroup parent){
View v = inflater.inflate(R.layout.row_category, parent, false);
TextView txtTitle = (TextView) v.findViewById(R.id.txtTitle);
txtTitle.setText("The text you want");
return v;
}
編輯 :要設置一個文本從List<String>
將您的CategoryAdapter
更改為:
public class CategoryAdapter extends ArrayAdapter{
private LayoutInflater inflater;
private List<String> titleList;
public CategoryAdapter(Activity activity, ArrayList<Category> items, List<String> titleList){
super(activity, R.layout.row_category, items);
inflater = activity.getWindow().getLayoutInflater();
this.titleList = titleList
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
View v = convertView
if(v == null)
v = inflater.inflate(R.layout.row_category, parent, false);
TextView txtTitle = (TextView) v.findViewById(R.id.txtTitle);
txtTitle.setText(titleList.get(position));
return v;
}
}
以及如何從Http請求中獲取List<String>
,這是一個全新的問題。
您應該在適配器getview中執行此操作
@Override
public View getView(int position, View convertView, ViewGroup parent){
View row = convertView;
if (row == null) {
LayoutInflater inflater = (LayoutInflater) this.getContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.row_category, parent, false);
}
TextView rowText = (TextView) row.findViewById(R.id.txtTitle);
rowText.setText("Custom Text");
return row;
}
在適配器的getView()方法中,聲明並初始化textview並將其設置為文本。 並更改您的構造函數
ArrayList<Category> items;
public CategoryAdapter(Activity activity, ArrayList<Category> items){
super(activity, R.layout.row_category, items);
inflater = activity.getWindow().getLayoutInflater();
this.items = items;
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
if (convertView == null) {
convertView = (View) inflater.inflate(R.layout.row_category, parent, false);
}
TextView textView = (TextView) convertView
.findViewById(R.id.txtTitle);
textView.setText(items.get(position).getName());
return convertView;
}
您需要改進ArrayAdapter
。
目前,您尚未將數據設置為TextView
。 請嘗試以下操作,但我沒有對其進行測試,但是它應該可以工作。
public class CategoryAdapter extends ArrayAdapter {
private LayoutInflater inflater;
public CategoryAdapter(Activity activity, ArrayList<Category> items){
super(activity, R.layout.row_category, items);
inflater = activity.getWindow().getLayoutInflater();
}
@Override
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = inflater.inflate(R.layout.row_category, parent, false);
viewHolder.textTile = (TextView) convertView.findViewById(R.id.txtTitle);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
Category category = (Category) getItem(position);
viewHolder.textTile.setText(category.getName());
return convertView;
}
public void refresh(ArrayList<Category> items) {
clear();
addAll(items);
notifyDataSetChanged();
}
private class ViewHolder {
public TextView textTile;
}
}
在您的getdeals
方法中將此循環更改為如下所示
try {
Category c = new Category();
for(int i=0;i<jArray.length();i++){
json_data = jArray.getJSONObject(i);
c.setName(json_data.getString("name"));
list.add(c);
}
categoryitemadapter.refresh(list);
} catch(JSONException je){
je.printStackTrace();
}
注意
您應該考慮使用RecyclerView
。 它比ListView
強大得多,可以讓您更好地控制單個列表項的動畫。 如果您願意,可以在這里閱讀
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.