Android簡單的使用listview動態生成不一樣頁面

前些日子,在oschina中看到一個網友的問題,是Android技術的。他須要在在後臺java代碼中根據服務器傳回來的數據類型去動態的生成控件來展現數據。因爲他是一個Android新手,若是要作真正的後臺動態生成控件的話,會比較吃力,我給他建議使用listview控件,將數據要求中全部可能用到的界面在xml佈局中弄好,而後後臺根據數據要求,引入對應的數據的界面到listview的item中便可。如此也就簡單易懂了。java

需求:實現一份問卷,備選答案展示形式由服務器傳過來的數據決定。即,根據數據要求,選擇不一樣的控件展示答案。android

服務器傳過來的數據類型有:text、radio、checkbox等。web

詳細代碼實現:服務器

界面佈局:activity_main.xmlapp

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >
    <ListView
        android:id="@+id/listView1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:descendantFocusability="beforeDescendants" >
    </ListView>
</LinearLayout>

 主界面佈局中使用了ListView 控件,下面就須要爲其添加item界面,這就是核心部分,這個item界面須要爲每一種可能的展示形式定義一個佈局文件。ide

數據要求的text的展示佈局代碼:listview_item_text.xml佈局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="20dp" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:text="我是題目~~" />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
        <EditText 
            android:id="@+id/answer"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:hint="我是答案" />
    </LinearLayout>
    <Button
        android:id="@+id/button1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="測試下輸入框文本" />
</LinearLayout>

數據要求是radio的展現佈局代碼:listview_item.xml測試

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    android:padding="20dp" >
    <TextView
        android:id="@+id/textView1"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:text="我是題目~~" />
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:orientation="horizontal" >
        <RadioGroup
            android:id="@+id/sex"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:orientation="horizontal" >
            <RadioButton
                android:id="@+id/boy"
                android:text="男" />
            <RadioButton
                android:id="@+id/gril"
                android:text="女" />
        </RadioGroup>
    </LinearLayout>
</LinearLayout>

這裏就再也不寫其它類型的佈局了,都是雷同的。this

後臺代碼:MainActivity.javacode

 package com.example.listviewtest;
import android.os.Bundle;
import android.app.Activity;
import android.widget.ListView;
/**
 * @author Rickey
 *
 */
public class MainActivity extends Activity {
 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);//引入主佈局
  ListView view = (ListView) findViewById(R.id.listView1);//得到主佈局的主控機listview
  
  String [] type = new  String []{"text","radio"};//定義數據類型
  ListviewAdapter adapter = new ListviewAdapter(this);//初始化listview適配器
  adapter.setStr(type);//給適配器傳值
  view.setAdapter(adapter);//啓動適配器,畫出界面
  
 }
}

這裏的listview不使用系統自帶的簡單適配器,由於我須要在適配器中根據數據的不一樣,選擇引入不一樣的佈局,因此就自定義了一個listview的適配器:ListviewAdapter.java

 package com.example.listviewtest;
import android.content.Context;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.TextView;
import android.widget.TextView.OnEditorActionListener;
import android.widget.Toast;
/**
 * @author Rickey
 *
 */
public class ListviewAdapter extends BaseAdapter {
 private LayoutInflater inflater;//畫布
 private Context context;//當前上下文
 
 public ListviewAdapter(Context context){
  this.context = context;//初始化當前上下文
        inflater = LayoutInflater.from(context); //初始化畫布
 }
 
 private String [] str = null;//須要顯示的數據
 /**
  * @return the str
  */
 public String[] getStr() {
  return str;
 }
 /**
  * @param str the str to set
  */
 public void setStr(String[] str) {
  this.str = str;
 }
 
 @Override
 public int getCount() {//須要顯示多少條數據
  // TODO Auto-generated method stub
  return str.length;
 }
 @Override
 public Object getItem(int position) {//當前數據
  // TODO Auto-generated method stub
  return str[position];
 }
 @Override
 public long getItemId(int position) {//當前數據的id
  // TODO Auto-generated method stub
  return position;
 }
 @Override
 public View getView(int position, View convertView, ViewGroup parent) {//開始畫出界面
  // TODO 自動生成的方法存根
  
   ViewHolder holder = new ViewHolder();//初始化ViewHolder對象
         if (convertView == null) {//若是當前畫出的對象爲null
          if (str[position].equals("text")) {//文本
           convertView = inflater.inflate(R.layout.listview_item_text, null);//引入待畫出的佈局
           convertView.setTag(holder);//將界面tag賦給ViewHolder保存
           textData(convertView, holder);//給界面賦值
   }
          if (str[position].equals("radio")) {//單選
           convertView = inflater.inflate(R.layout.listview_item, null);//引入待畫出的佈局
           convertView.setTag(holder);//將界面tag賦給ViewHolder保存
           radioDataVoid(convertView, holder);//給界面賦值
          }
         }
         else {//不然
             holder = (ViewHolder) convertView.getTag();//直接取tag給ViewHolder
         }
         return convertView;//將界面返回畫出
 
 }
 class ViewHolder {//子界面控制
  TextView itemName;//題目
  RadioButton boy;//單選按鈕1
  RadioButton gril;//單選按鈕2
  
  EditText answer;//編輯框的答案
  Button button1;//測試編輯框按鈕
 }
 
 /**
  * 給textview界面賦值
  * @param convertView
  * @param holder
  */
 private void textData(final View convertView, final ViewHolder holder) {
  holder.itemName = (TextView) convertView.findViewById(R.id.textView1);
  holder.answer = (EditText) convertView.findViewById(R.id.answer);
  holder.button1 = (Button) convertView.findViewById(R.id.button1);
  holder.button1.setOnClickListener(new OnClickListener() {//測試編輯框答案的按鈕設置點擊監聽事件
   
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(context, holder.answer.getText().toString(), Toast.LENGTH_SHORT).show();//顯示編輯框的答案值
   }
  });
  //上面與下面兩個方法均可以,隨便選一種就行
  holder.answer.setOnEditorActionListener(new OnEditorActionListener() {//編輯框設置編輯完成監聽,當用戶點擊鍵盤上的「完成」按鈕,則將編輯框的答案值顯示
   
   @Override
   public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
    // TODO Auto-generated method stub
    Toast.makeText(context, holder.answer.getText().toString(), Toast.LENGTH_SHORT).show();
    return false;
   }
  });
 }
 
 /**
  * 給單選的界面賦值
  * @param convertView
  * @param holder
  */
 private void radioDataVoid(final View convertView, final ViewHolder holder) {
  holder.itemName = (TextView) convertView.findViewById(R.id.textView1);
  holder.boy = (RadioButton) convertView.findViewById(R.id.boy);
  holder.gril = (RadioButton) convertView.findViewById(R.id.gril);
  holder.boy.setOnClickListener(new OnClickListener() {//爲單選按鈕設置點擊選中監聽
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(context, "你選擇了【"+holder.boy.getText().toString()+"】", Toast.LENGTH_SHORT).show();
   }
  });
  holder.gril.setOnClickListener(new OnClickListener() {//爲單選按鈕設置點擊選中監聽
   @Override
   public void onClick(View v) {
    // TODO Auto-generated method stub
    Toast.makeText(context, "你選擇了【"+holder.gril.getText().toString()+"】", Toast.LENGTH_SHORT).show();
   }
  });
 }
}

整個代碼到這裏就結束了。主要是在listview的適配器中作數據的判斷和選擇引入不一樣的界面就能夠實現了,簡單容易理解。比較適合新手。若是要求真正的技術或者比較熟悉了Android這個技術了,這種方法仍是很不建議的,使用後臺生成界面,最難的就是明白整麼控制佈局,Android的佈局不像web,Android的佈局嚴格的遵循一個相似於父子關係的規矩。好比給佈局的一個textview設置長寬,須要先設置它父親的長度,而後經過它父親的長寬來設置它的長寬。

到此止了。

相關文章
相關標籤/搜索