2012-06-07 99 views
8

我有一個ListView中的Checkbox和EditText以及Textview。它從列表中獲取文本視圖的值。複選框將被動態檢查。以同樣的方式EditText也可以動態輸入。現在我的問題是,當我在編輯文本中輸入文本後滾動列表視圖(上下)時,我無法獲得鍵入的值。我也檢查複選框。但是使用這個位置,我設置它是正確的。我無法知道如何正確設置EditText值到列表中。請幫幫我。這裏是我的代碼:如何在listview中添加EditText並在所有行中動態獲取其值?

的main.xml:(發射升空主XML)

<?xml version="1.0" encoding="utf-8"?> 
<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/my_list" 
android:layout_width="fill_parent" 
android:layout_height="250px" /> 
<Button 
android:text="Save" 
android:id="@+id/btnSave" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"/> 

</LinearLayout> 

row.xml:(ListView的行)

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" > 

<TextView 
android:id="@+id/label" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:text="@+id/label" 
android:textSize="30sp"/> 

<CheckBox 
android:id="@+id/check" 
android:layout_width="wrap_content" 
android:layout_height="wrap_content"/> 
<EditText 
android:text="" 
android:id="@+id/txtAddress" 
android:layout_width="150px" 
android:layout_height="wrap_content"/> 
</LinearLayout> 

Model.Java:(這是POJO類)

package com.checkboxlistview; 

public class Model { 

private String name; 
private boolean selected; 
private String address; 

public String getAddress() { 
    return address; 
} 

public void setAddress(String address) { 
    this.address = address; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public Model(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

public boolean isSelected() { 
    return selected; 
} 

public void setSelected(boolean selected) { 
    this.selected = selected; 
} 

} 

MyAdapter.Java:(這是用於使用所述轉換器和保持器保持在列表視圖中的視圖)

package com.checkboxlistview; 

import java.util.List; 
import android.app.Activity; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.EditText; 
import android.widget.TextView; 

public class MyAdapter extends ArrayAdapter<Model> implements TextWatcher { 

private final List<Model> list; 
private final Activity context; 
int listPosititon; 

public MyAdapter(Activity context, List<Model> list) { 
    super(context, R.layout.row, list); 
    this.context = context; 
    this.list = list; 
} 

static class ViewHolder { 
    protected TextView text; 
    protected CheckBox checkbox; 
    protected EditText address; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    listPosititon = position; 
    ViewHolder viewHolder = null; 
    if (convertView == null) { 
     LayoutInflater inflator = context.getLayoutInflater(); 
     convertView = inflator.inflate(R.layout.row, null); 
     viewHolder = new ViewHolder(); 
     viewHolder.text = (TextView) convertView.findViewById(R.id.label); 
     viewHolder.checkbox = (CheckBox) convertView 
       .findViewById(R.id.check); 
     viewHolder.address = (EditText) convertView 
       .findViewById(R.id.txtAddress); 
     viewHolder.checkbox 
       .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

@Override 
public void onCheckedChanged(CompoundButton buttonView, 
boolean isChecked) { 
int getPosition = (Integer) buttonView.getTag(); 
//Here we get the position that we have set for the checkbox using setTag. 
list.get(getPosition).setSelected(
buttonView.isChecked()); 
// Set the value of checkbox to maintain its state. 
} 
}); 
     viewHolder.address.addTextChangedListener(this); 

     convertView.setTag(viewHolder); 
     convertView.setTag(R.id.label, viewHolder.text); 
     convertView.setTag(R.id.check, viewHolder.checkbox); 
     convertView.setTag(R.id.txtAddress, viewHolder.address); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 
    viewHolder.checkbox.setTag(position); // This line is important. 

    viewHolder.text.setText(list.get(position).getName()); 
    viewHolder.checkbox.setChecked(list.get(position).isSelected()); 
    if (list.get(position).getAddress() != null) { 
     viewHolder.address.setText(list.get(position).getAddress() + ""); 
    } else { 
     viewHolder.address.setText(""); 
    } 

    return convertView; 
} 

@Override 
public void afterTextChanged(Editable s) { 
    list.get(listPosititon).setAddress(s.toString()); 
} 

@Override 
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2, 
     int arg3) { 
    // TODO Auto-generated method stub 

} 

@Override 
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) { 
    // TODO Auto-generated method stub 

} 
} 

MainActivity.java(這是活性):

package com.checkboxlistview; 

import java.util.ArrayList; 
import java.util.List; 

import android.app.Activity; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.ArrayAdapter; 
import android.widget.Button; 
import android.widget.ListView; 
import android.widget.Toast; 

public class MainActivity extends Activity { 
ListView listView; 
Button btnSave; 
    ArrayAdapter<Model> adapter; 
    List<Model> list = new ArrayList<Model>(); 

    public void onCreate(Bundle icicle) { 
     super.onCreate(icicle); 
     setContentView(R.layout.main); 

     listView = (ListView) findViewById(R.id.my_list); 
     btnSave = (Button)findViewById(R.id.btnSave); 
     adapter = new MyAdapter(this,getModel()); 
     listView.setAdapter(adapter); 
     btnSave.setOnClickListener(new View.OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       for (int i = 0; i < list.size(); i++) { 
        Toast.makeText(getBaseContext(), "Name : "+list.get(i).getName() +" Selected: "+list.get(i).isSelected(), Toast.LENGTH_SHORT).show(); 

       } 
      } 
     }); 
    } 


    private List<Model> getModel() { 
     list.add(new Model("Linux")); 
     list.add(new Model("Windows7")); 
     list.add(new Model("Suse")); 
     list.add(new Model("Eclipse")); 
     list.add(new Model("Ubuntu")); 
     list.add(new Model("Solaris")); 
     list.add(new Model("Android")); 
     list.add(new Model("iPhone")); 
     list.add(new Model("Java")); 
     list.add(new Model(".Net")); 
     list.add(new Model("PHP")); 
     return list; 
    } 
} 

有一個在代碼沒有錯誤。它運行良好。我可以保持複選框的位置並顯示在相同的位置,即使我上下滾動。但我無法正確設置EditText值。請幫助我。 在此先感謝。

回答

4

您可以使用自定義列表視圖來實現此目的。

找到的EditText列表視圖的例子是here

+0

嗨Munish卡普爾,感謝您的答覆。這個對我有用。我使用AddTextChangedListener從EditText獲取文本。但是使用你的示例我知道,我們需要使用setOnFocusChangeListener。非常感謝。我試了兩天。 – Mathew

+0

您的歡迎.. :) –

+0

嗨Munish卡普爾,我有這個複選框和列表視圖編輯文本中的另一個問題。當我點擊一個複選框時,它必須關注特定的行EditText。如何做到這一點。請幫助我。 – Mathew

0

只要保持viewHolder.address.setTag(位置)和它的作品完美的歡呼聲。

適配器類別:

package com.qzick.adapter; 

import java.util.ArrayList; 
import android.content.Context; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.View.OnClickListener; 
import android.view.ViewGroup; 
import android.widget.BaseAdapter; 
import android.widget.CheckBox; 
import android.widget.CompoundButton; 
import android.widget.CompoundButton.OnCheckedChangeListener; 
import android.widget.EditText; 
import android.widget.TextView; 

import com.example.qzick.R; 
import com.qzick.model.Get_All_Class_Model; 

public class Get_Class_Adapter extends BaseAdapter { 
    protected ArrayList<Get_All_Class_Model> get_class_details; 
    LayoutInflater inflater; 
    Context context; 
    private int x = 1; 

    public Get_Class_Adapter(Context context, 
      ArrayList<Get_All_Class_Model> get_class_details) { 
     this.get_class_details = get_class_details; 
     this.inflater = LayoutInflater.from(context); 
     this.context = context; 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return get_class_details.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return get_class_details.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return 0; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     final ViewHolder holder; 
     if (convertView == null) { 
      holder = new ViewHolder(); 
      convertView = this.inflater.inflate(
        R.layout.activity_adapter_class_ll, parent, false); 

      holder.textclass = (TextView) convertView 
        .findViewById(R.id.text_class_ll); 

      holder.txtid = (TextView) convertView.findViewById(R.id.text_id_ll); 

      holder.checkclass = (CheckBox) convertView 
        .findViewById(R.id.check_class_LL); 

      holder.edtsection = (EditText) convertView 
        .findViewById(R.id.edttxt_addsection_ll); 

      holder.checkclass 
        .setOnCheckedChangeListener(new OnCheckedChangeListener() { 

         @Override 
         public void onCheckedChanged(CompoundButton buttonView, 
           boolean isChecked) { 

          int getPosition = (Integer) buttonView.getTag(); 

          get_class_details.get(getPosition).setChecked(
            buttonView.isChecked()); 

          notifyDataSetChanged(); 
         } 
        }); 

      convertView.setTag(holder); 
      convertView.setTag(R.id.check_class_LL, holder.checkclass); 
      convertView.setTag(R.id.edttxt_addsection_ll, holder.edtsection); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.checkclass.setTag(position); 
     holder.edtsection.setTag(position); 

     holder.edtsection.addTextChangedListener(new TextWatcher() { 

      @Override 
      public void onTextChanged(CharSequence s, int start, int before, 
        int count) { 
       int pos = (Integer) holder.edtsection.getTag(); 

       get_class_details.get(pos).setEdtsections(s.toString()); 

      } 

      @Override 
      public void beforeTextChanged(CharSequence s, int start, int count, 
        int after) { 

      } 

      @Override 
      public void afterTextChanged(Editable s) { 

      } 
     }); 

     holder.txtid.setText(get_class_details.get(position).getId()); 
     holder.textclass.setText(get_class_details.get(position).getText()); 
     holder.edtsection.setText(get_class_details.get(position) 
       .getEdtsections()); 

     holder.textclass.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 

       x++; 

       if (x % 2 == 0) { 
        holder.checkclass.setChecked(false); 

       } else { 
        holder.checkclass.setChecked(true); 
       } 

      } 
     }); 

     holder.checkclass.setChecked(get_class_details.get(position) 
       .isChecked()); 
     return convertView; 
    } 

    private class ViewHolder { 
     TextView textclass, txtid;`enter code here` 
     CheckBox checkclass; 
     EditText edtsection; 
    } 
} 
相關問題