2017-02-10 7 views
0

何千人もの人がスタックオーバーフローで抱いていた問題があります。私は再び質問するのが悪いと感じますが、すべての質問を読み、自分のケースに実装しようとしましたが、おそらく私はそれらを間違って実装しました。Android - カスタムリストビューアアダプターでテキストとスピナーを編集

ここは私の質問です。私は1つのスピナーとedittextを持っているカスタムリストビューを持っています。動的に行を作成します。あなたが知っているように、edittextがうまくいけば、スクロールするとスムーズにスクロールするためのビューホルダーのパターンが表示されますが、リストビューは正しく表示されません。編集テキストは、スクロールするとそれ自体が複製されます。私はスピンナーとedittextを一緒に持っているので、ユーザー入力を別のクラスに保存しようとしています。私リストビューの行レイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="match_parent" 
> 


<Spinner 
    android:layout_width="128dp" 
    android:layout_height="wrap_content" 
    android:id="@+id/ListViewSpinner" 
    android:layout_marginTop="10dp" 
    /> 

<EditText 
    android:layout_marginRight="12dp" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:inputType="number" 
    android:id="@+id/ListViewEditText" 
    android:textSize="16dp" 
    android:hint="Enter the CRN" 
    android:layout_alignParentTop="true" 
    android:layout_toRightOf="@+id/ListViewSpinner" 
    android:layout_toEndOf="@+id/ListViewSpinner" /> 

</RelativeLayout> 

マイCourseClass.java

public class CourseClass { 
private ArrayList<String> course_name; 
private String course_crn; 


public CourseClass(ArrayList<String> course_name, String course_crn) { 
    super(); 
    this.setCourse_crn(course_crn); 
    this.setCourse_name(course_name); 
} 

public ArrayList<String> getCourse_name() { 
    return course_name; 
} 

public void setCourse_name(ArrayList<String> course_name) { 
    this.course_name = course_name; 
} 

public String getCourse_crn() { 
    return course_crn; 
} 

public void setCourse_crn(String course_crn) { 
    this.course_crn = course_crn; 
} 
} 

マイCourseAdapter.java

public class CourseAdapter extends ArrayAdapter<CourseClass> { 
Context context; 

public CourseAdapter(Context context, int layoutResourceId, int resource) { 
    super(context, resource); 
    this.layoutResourceId = layoutResourceId; 
    this.context = context; 

} 

@Override 
public void add(CourseClass object) { 
    super.add(object); 
} 

@Override 
public void remove(CourseClass object) { 
    super.remove(object); 
} 

@Override 
public long getItemId(int position) { 
    return super.getItemId(position); 
} 

@Override 
public int getCount() { 
    return super.getCount(); 
} 


@NonNull 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    final ViewHolder holder; 
    if (row == null) { 


     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(R.layout.list_view_row_layout, null); 
     holder = new ViewHolder(); 
     holder.courseSpinner = (Spinner) row.findViewById(R.id.ListViewSpinner); 
     holder.courseCrn = (EditText) row.findViewById(R.id.ListViewEditText); 

     row.setTag(holder); 
    } else { 
     holder = (ViewHolder) row.getTag(); 
    } 
    final CourseClass course = (CourseClass) getItem(position); 
    holder.courseCrn.setText(course.getCourse_crn()); 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, R.layout.support_simple_spinner_dropdown_item, course.getCourse_name()); 
    holder.courseSpinner.setAdapter(arrayAdapter); 
    return row; 
} 

public class ViewHolder { 
    Spinner courseSpinner; 
    EditText courseCrn; 
} 

} 

私はすでにすべての質問とチュートリアルを読みましたが、私はまだ分かりません。

エラーの原因を表示したり、問題を解決するためのアイデアを教えていただけますか?

+0

chnages:行= inflater.inflate(R.layout.list_view_row_layout、親、偽)。今はviewholderクラスを静的にします –

+0

リサイクラビューを使うのがより良いオプションになります –

+0

ありがとう@Divyeshしかし、今は値を複製しませんが、今度はedittextがscreen.Canを外すと完全に削除されます。 @ RanjanK.M。 – Alperen

答えて

2

courseCrnの編集後にコースオブジェクトを更新していません。 getView()メソッドをCourseAdapterクラスに変更してください。


@NonNull 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    View row = convertView; 
    final ViewHolder holder; 

    if (row == null) { 
     LayoutInflater inflater = ((Activity) context).getLayoutInflater(); 
     row = inflater.inflate(R.layout.list_view_row_layout, null); 
     holder = new ViewHolder(); 
     holder.courseSpinner = (Spinner) row.findViewById(R.id.ListViewSpinner); 
     holder.courseCrn = (EditText) row.findViewById(R.id.ListViewEditText); 

     row.setTag(holder); 
    } else { 
     holder = (ViewHolder) row.getTag(); 
    } 
    final CourseClass course = (CourseClass) getItem(position); 
    holder.courseCrn.setText(course.getCourse_crn()); 
    ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(context, R.layout.support_simple_spinner_dropdown_item, course.getCourse_name()); 
    holder.courseSpinner.setAdapter(arrayAdapter); 
    holder.courseCrn.addTextChangedListener(new TextWatcher() { 
     @Override 
     public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

     } 

     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count) { 

     } 

     @Override 
     public void afterTextChanged(Editable s) { 
      course.setCourse_crn(s.toString()); 
     } 
    }); 
    return row; 
} 
+0

ありがとう、私は今これを追加しましたが、画面から消えたときにフィールドを削除します。同じ問題が続きます。 – Alperen

+0

@Alperen githubでこのコードを確認してください。ここではgithubプロジェクトのリンクです。[link] https://github.com/SanjayKushwah0601/SpinnerWithEditText –

+0

私のコードはあなたが与えたものと全く同じですが、私はそれを消すときにedittextに何かを書いています。助けて。私は – Alperen

関連する問題