Android 具有自定义适配器的listview-每个其他项元素都是重复的
我觉得我的listview和它的customadapter遇到了一个奇怪的问题 问题是,对于listview中的每个项目,我都有一些不同的视图元素,例如EditText字段等。 每当我在listview中有2个以上的项目时,这些元素的条目现在就在其他每个项目中 让我举一个例子: -我正在列表视图中添加8项。 -我在第一个文本字段中输入一个值 -现在相同的值在文本字段中重复:3、5和7 -如果我在第二个项目的文本字段中输入一个值,该值将在项目编号的文本字段中重复:4、6和8 我希望你现在能看到这个问题 以下是解决此问题的一些相关代码: 首先,我的customadapter(CreateProgramAdapter)的代码:Android 具有自定义适配器的listview-每个其他项元素都是重复的,android,xml,android-listview,custom-adapter,Android,Xml,Android Listview,Custom Adapter,我觉得我的listview和它的customadapter遇到了一个奇怪的问题 问题是,对于listview中的每个项目,我都有一些不同的视图元素,例如EditText字段等。 每当我在listview中有2个以上的项目时,这些元素的条目现在就在其他每个项目中 让我举一个例子: -我正在列表视图中添加8项。 -我在第一个文本字段中输入一个值 -现在相同的值在文本字段中重复:3、5和7 -如果我在第二个项目的文本字段中输入一个值,该值将在项目编号的文本字段中重复:4、6和8 我希望你现在能看到这个
公共类CreateProgramAdapter扩展BaseAdapter{
私人充气机;
私人ArrayList培训通行证;
私人清单项目;
私人内部布局资源;
私人语境;
公共CreateProgramAdapter(上下文、列表项){
this.context=上下文;
这个项目=项目;
this.inflater=LayoutInflater.from(this.context);
}
@凌驾
public int getCount(){
返回items.size();
}
@凌驾
公共培训通行证获取项目(内部位置){
返回项目。获取(位置);
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图;
培训证持有人;
if(convertView==null){
视图=充气机。充气(R.layout.adapter\u createprogram\u trainingpasses\u项,父项,false);
持有人=新培训通行证持有人();
视图.设置标签(支架);
}否则{
视图=转换视图;
holder=(TrainingPassHolder)view.getTag();
}
holder.trainingPass=此.getItem(位置);
holder.trainingPass.trainingPassID=位置+1;
holder.trainingPassContainer=(RelativeLayout)view.findViewById(R.id.trainingPassContainer);
holder.trainingPassHeadlineShowHide=(TextView)view.findViewById(R.id.trainingpass\u headline);
holder.noExercisesYet=(TextView)view.findViewById(R.id.txt\u还没有练习);
holder.exerciseSearchField=(EditText)view.findViewById(R.id.trainingpass\u exercise\u searchfield);
holder.trainingPassSetsListView=(ListView)view.findViewById(R.id.trainingpass\u sets\u ListView);
holder.exercisesListView=(ListView)view.findViewById(R.id.exercises\u ListView);
holder.addSetButton=(按钮)view.findViewById(R.id.add_set_按钮);
holder.addExerciseButton=(Button)view.findViewById(R.id.add\u exercise\u Button);
holder.deleteTrainingpass=(按钮)view.findViewById(R.id.delete_trainingpass_按钮);
holder.doneTrainingpass=(按钮)view.findViewById(R.id.done\u trainingpass\u按钮);
项目(持有人);
返回视图;
}
私人物品(培训通行证持有人培训通行证持有人){
最终培训通行证持有人=培训通行证持有人;
int trainingPassID=TrainingPasspholder.trainingPass.trainingPassID;
TextView showHide=holder.trainingPassHeadlineShowHide;
按钮addSet=holder.addSetButton;
按钮deleteTrainingPass=holder.deleteTrainingPass;
最终编辑文本exerciseNameField=holder.exercisearchfield;
//设置培训通行证的名称
showHide.setText(“培训通行证”+培训通行证ID);
//设定练习名称
if(trainingPassHolder.trainingPass.tempExerciseName!=null){
System.out.println(holder.trainingPass.tempExerciseName);
exerciseName字段.setText(holder.trainingPass.tempExerciseName);
}否则{
exerciseNameField.setText(“”);
}
//将1个默认设置添加到练习
if(holder.sets.size()==0){
支架.套.增加(1);
}
/*
设置培训通行证列表视图集合的适配器
*/
最终培训PassSetAdapter createProgramAdapter=新培训PassSetAdapter(上下文,holder.sets);
holder.TrainingPassSetListView.setAdapter(createProgramAdapter);
exerciseNameField.setOnKeyListener(新视图.OnKeyListener(){
@凌驾
公共布尔onKey(视图v、int keyCode、KeyEvent事件){
holder.trainingPass.tempExerciseName=exerciseNameField.getText().toString();
返回false;
}
});
/*
显示/隐藏培训通行证
*/
showHide.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
if(培训通行证持有人,可见){
holder.trainingPass.visible=假;
holder.trainingPassContainer.setVisibility(View.GONE);
}否则{
holder.trainingPass.visible=真;
holder.trainingPassContainer.setVisibility(视图可见);
}
}
});
/*
将集合添加到listview
*/
addSet.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
支架.套.增加(1);
createProgramAdapter.notifyDataSetChanged();
}
});
/*
删除培训通行证
*/
deleteTrainingPass.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图v){
项目。移除(支架。培训通行证);
notifyDataSetChanged();
}
});
}
脉波重复间隔
public class CreateProgramAdapter extends BaseAdapter {
private LayoutInflater inflater;
private ArrayList<TrainingPass> trainingPasses;
private List<TrainingPass> items;
private int layoutResourceId;
private Context context;
public CreateProgramAdapter(Context context, List<TrainingPass> items) {
this.context = context;
this.items = items;
this.inflater = LayoutInflater.from(this.context);
}
@Override
public int getCount() {
return items.size();
}
@Override
public TrainingPass getItem(int position) {
return items.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
TrainingPassHolder holder;
if(convertView == null) {
view = inflater.inflate(R.layout.adapter_createprogram_trainingpasses_item, parent, false);
holder = new TrainingPassHolder();
view.setTag(holder);
} else {
view = convertView;
holder = (TrainingPassHolder)view.getTag();
}
holder.trainingPass = this.getItem(position);
holder.trainingPass.trainingPassID = position + 1;
holder.trainingPassContainer = (RelativeLayout) view.findViewById(R.id.trainingPassContainer);
holder.trainingPassHeadlineShowHide = (TextView) view.findViewById(R.id.trainingpass_headline);
holder.noExercisesYet = (TextView) view.findViewById(R.id.txt_no_exercises_yet);
holder.exerciseSearchField = (EditText) view.findViewById(R.id.trainingpass_exercise_searchfield);
holder.trainingPassSetsListView = (ListView) view.findViewById(R.id.trainingpass_sets_listview);
holder.exercisesListView = (ListView) view.findViewById(R.id.exercises_listview);
holder.addSetButton = (Button) view.findViewById(R.id.add_set_button);
holder.addExerciseButton = (Button) view.findViewById(R.id.add_exercise_button);
holder.deleteTrainingpass = (Button) view.findViewById(R.id.delete_trainingpass_button);
holder.doneTrainingpass = (Button) view.findViewById(R.id.done_trainingpass_button);
setupItems(holder);
return view;
}
private void setupItems(TrainingPassHolder trainingPassHolder) {
final TrainingPassHolder holder = trainingPassHolder;
int trainingPassID = trainingPassHolder.trainingPass.trainingPassID;
TextView showHide = holder.trainingPassHeadlineShowHide;
Button addSet = holder.addSetButton;
Button deleteTrainingPass = holder.deleteTrainingpass;
final EditText exerciseNameField = holder.exerciseSearchField;
// Set title of the trainingpass
showHide.setText("Trainingpass " + trainingPassID);
// Set name of exercise
if (trainingPassHolder.trainingPass.tempExerciseName != null) {
System.out.println(holder.trainingPass.tempExerciseName);
exerciseNameField.setText(holder.trainingPass.tempExerciseName);
} else {
exerciseNameField.setText("");
}
// Add 1 default set to exercise
if (holder.sets.size() == 0) {
holder.sets.add(1);
}
/*
Set adapter for sets of the listview for the trainingpass
*/
final TrainingPassSetsAdapter createProgramAdapter = new TrainingPassSetsAdapter(context, holder.sets);
holder.trainingPassSetsListView.setAdapter(createProgramAdapter);
exerciseNameField.setOnKeyListener(new View.OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
holder.trainingPass.tempExerciseName = exerciseNameField.getText().toString();
return false;
}
});
/*
Show / hide the trainingpass
*/
showHide.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (holder.trainingPass.visible) {
holder.trainingPass.visible = false;
holder.trainingPassContainer.setVisibility(View.GONE);
} else {
holder.trainingPass.visible = true;
holder.trainingPassContainer.setVisibility(View.VISIBLE);
}
}
});
/*
Add set to the listview
*/
addSet.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
holder.sets.add(1);
createProgramAdapter.notifyDataSetChanged();
}
});
/*
Delete training pass
*/
deleteTrainingPass.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
items.remove(holder.trainingPass);
notifyDataSetChanged();
}
});
}
private static class TrainingPassHolder {
ArrayList<Integer> sets = new ArrayList<Integer>();
TrainingPass trainingPass;
RelativeLayout trainingPassContainer;
TextView trainingPassHeadlineShowHide;
TextView noExercisesYet;
EditText exerciseSearchField;
ListView trainingPassSetsListView;
ListView exercisesListView;
Button addSetButton;
Button addExerciseButton;
Button deleteTrainingpass;
Button doneTrainingpass;
}
}
public class TrainingPass {
public String trainingPassName;
public ArrayList<Exercise> exercises;
public int trainingPassID;
public boolean visible = false;
public String tempExerciseName;
public TrainingPass() {
exercises = new ArrayList<Exercise>();
}
public void addExercise(Exercise exercise ) {
exercises.add(exercise);
}
}
public class CreateProgramActivity extends CustomActivity {
private ArrayList<TrainingPass> trainingPasses;
private CreateProgramAdapter createProgramAdapter;
private ListView trainingPassesListView;
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_create_program);
trainingPasses = new ArrayList<TrainingPass>();
trainingPassesListView = (ListView)findViewById(R.id.listView_trainingpasses);
createProgramAdapter = new CreateProgramAdapter(CreateProgramActivity.this, trainingPasses);
trainingPassesListView.setAdapter(createProgramAdapter);
}
public void addTrainingPass(View v) {
TrainingPass trainingPass = new TrainingPass();
trainingPasses.add(trainingPass);
createProgramAdapter.notifyDataSetChanged();
}
public void addTrainingPassHelp(View v) {
Toast.makeText(this, "Add training pass HELP!", Toast.LENGTH_SHORT).show();
}
public void createProgram(View v) {
Toast.makeText(this, "Create program", Toast.LENGTH_SHORT).show();
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.mobileplatformexam.activities.CreateProgramActivity"
android:id="@+id/relativeLayoutCreateProgram">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add training pass"
android:id="@+id/btn_add_trainingpass"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_toLeftOf="@+id/btn_add_trainingpass_help"
android:layout_toStartOf="@+id/btn_add_trainingpass_help"
android:onClick="addTrainingPass"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="\?"
android:id="@+id/btn_add_trainingpass_help"
android:layout_alignParentTop="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:onClick="addTrainingPassHelp"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Create program"
android:id="@+id/btn_create_program"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/btn_add_trainingpass_help"
android:layout_alignEnd="@+id/btn_add_trainingpass_help"
android:onClick="createProgram"/>
<ListView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/listView_trainingpasses"
android:layout_above="@+id/btn_create_program"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/btn_add_trainingpass" />
</RelativeLayout>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center_horizontal"
android:orientation="horizontal"
android:padding="10dp">
<TextView
android:id="@+id/trainingpass_headline"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="false"
android:layout_alignParentTop="true"
android:text="Trainingpass"
android:textSize="16dp"
android:textColor="@android:color/white"
android:background="@android:color/holo_blue_dark"
android:height="35dp"
android:gravity="center_vertical"
android:paddingLeft="10dp"
android:textIsSelectable="true"
android:textStyle="bold"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<ImageView
android:id="@+id/trainingpass_showhide_imageview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@android:color/holo_blue_dark"
android:height="25dp"
android:minWidth="50dp"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:padding="7dp"
android:layout_alignBottom="@+id/trainingpass_headline"
android:src="@mipmap/arrows_up_down"
android:layout_alignParentTop="true" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_below="@+id/trainingpass_headline"
android:layout_alignLeft="@+id/trainingpass_headline"
android:layout_alignStart="@+id/trainingpass_headline"
android:id="@+id/trainingPassContainer"
android:background="@color/blue_bg_neutral"
android:visibility="visible"
android:paddingBottom="10dp">
<EditText
android:id="@+id/trainingpass_exercise_searchfield"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:hint="Name of exercise"
android:padding="6dp"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:background="@color/blue_bg_inputField"
android:layout_margin="10dp" />
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/trainingpass_exercise_searchfield"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:id="@+id/sets_container"
android:background="@color/blue_bg_inputField"
android:padding="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp">
<TextView
android:id="@+id/txt_sets_for_exercise"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Sets for exercise"
android:textSize="14dp"
android:textColor="@android:color/black"
android:paddingRight="30dp"
android:paddingLeft="0dp"
android:paddingTop="0dp"
android:paddingBottom="10dp"
android:textStyle="bold"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/add_set_button"
android:layout_alignEnd="@+id/add_set_button" />
<ListView
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/trainingpass_sets_listview"
android:nestedScrollingEnabled="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignTop="@+id/txt_no_sets"
android:layout_alignBottom="@+id/txt_no_sets" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add set"
android:id="@+id/add_set_button"
android:layout_below="@+id/trainingpass_sets_listview"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Add exercise"
android:id="@+id/add_exercise_button"
android:layout_below="@+id/add_set_button"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true" />
<TextView
android:id="@+id/txt_no_sets"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No sets yet"
android:textSize="14dp"
android:textColor="@android:color/black"
android:paddingRight="30dp"
android:paddingLeft="10dp"
android:paddingTop="20dp"
android:paddingBottom="10dp"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_below="@+id/txt_sets_for_exercise"
android:visibility="invisible" />
</RelativeLayout>
<RelativeLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_below="@+id/sets_container"
android:id="@+id/exercises_container"
android:background="@color/blue_bg_inputField"
android:padding="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:layout_marginTop="10dp">
<TextView
android:id="@+id/txt_exercises"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Exercises"
android:textSize="14dp"
android:textColor="@android:color/black"
android:paddingRight="30dp"
android:paddingLeft="0dp"
android:paddingTop="0dp"
android:paddingBottom="10dp"
android:textStyle="bold"
android:layout_alignParentTop="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_alignRight="@+id/txt_no_exercises_yet"
android:layout_alignEnd="@+id/txt_no_exercises_yet" />
<TextView
android:id="@+id/txt_no_exercises_yet"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="No exercises yet"
android:textSize="14dp"
android:textColor="@android:color/black"
android:paddingRight="30dp"
android:paddingLeft="10dp"
android:paddingTop="20dp"
android:paddingBottom="10dp"
android:layout_below="@+id/txt_exercises"
android:layout_alignParentRight="true"
android:layout_alignParentEnd="true"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true" />
<ListView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:id="@+id/exercises_listview"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:layout_below="@+id/txt_exercises"
android:layout_alignBottom="@+id/txt_no_exercises_yet" />
</RelativeLayout>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Delete"
android:id="@+id/delete_trainingpass_button"
android:layout_alignRight="@+id/exercises_container"
android:layout_alignEnd="@+id/exercises_container"
android:layout_below="@+id/exercises_container"
android:background="@color/btn_red"
android:layout_marginLeft="10dp" />
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Done"
android:id="@+id/done_trainingpass_button"
android:layout_below="@+id/exercises_container"
android:layout_alignLeft="@+id/exercises_container"
android:layout_alignStart="@+id/exercises_container"
android:layout_toStartOf="@+id/delete_trainingpass_button"
android:background="@color/btn_green"
android:layout_marginRight="10dp" />
</RelativeLayout>
</RelativeLayout>
class Items {
String name;
String searchField=""; //to stored edit text values , init with empty string
//create getter and setter
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
if (convertView == null) {
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.your_adapter_layout, null);
holder.textView1 = (TextView) convertView.findViewById(R.id.textView1);
holder.editText1 = (EditText) convertView.findViewById(R.id.editText1);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
//holder.position to store view position
holder.position= position;
item=items.get(position);
holder.textView1.setText(item.getName());
holder.editText1.setText(item.getSearchField());
holder.editText1.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence arg0, int arg1, int arg2, int arg3) {
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
}
@Override
public void afterTextChanged(Editable arg0) {
//set more conditions if needed - like arg0=null, or empty
items.get(holder.position).setSearchField(arg0.toString());
}
});
return convertView;
}
private class ViewHolder {
TextView textView1;
EditText editText1;
int position;
}