TextView 및 Spinner가있는 ListView의 사용자 지정 어댑터로 작업하고 있습니다. Spinner에서 값을 선택한 후 해당 값의 동일한 Row 행의 TextView에 값을 복사합니다.안드로이드의 scroll에서 반복되는 값을 보여주는 listview 행의 TextView?
문제는 ListView에 40 개가 넘는 요소가 있기 때문에 첫 번째 회 전자를 선택하고 스크롤 할 때 각각의 TextView에 값을 설정하면 동일한 값이 10 번째 행 TextView에 표시됩니다.
값은 첫 번째 TextView에서 스크롤 할 때 10 번째 TextView로 복사됩니다. 다음은
내가 사용하고있는 코드입니다 :public class AppListAdapter extends BaseAdapter {
private LayoutInflater mInflater;
private List<App> mApps = Constants.list;
private Context _activity;
ArrayList<String> months=null;
ArrayAdapter<String> dataAdapter =null;
int spinerposition;
int viewposition;
int temp=0;
private int screenWidth;
/**
* Constructor.
*
* @param context the application context which is needed for the layout inflater
* @param screenWidth
*/
public AppListAdapter(Context context, int screenWidth) {
// Cache the LayoutInflate to avoid asking for a new one each time.
mInflater = LayoutInflater.from(context);
this._activity=context;
this.screenWidth = screenWidth;
months = new ArrayList<String>();
months.add("No Item Selected");
months.add("None");
months.add("Entertainment");
months.add("Games");
months.add("News/Books");
months.add("Social Networking");
months.add("Utilities");
months.add("Texting");
months.add("Web Browsers");
// Creating adapter for spinner
dataAdapter = new ArrayAdapter<String>(_activity,
android.R.layout.simple_spinner_item, months);
// Drop down layout style - list view with radio button
dataAdapter.setDropDownViewResource(android.R.layout.select_dialog_singlechoice);
}
public int getCount() {
return mApps.size();
}
public Object getItem(int position) {
return mApps.get(position);
}
public long getItemId(int position) {
return position;
}
public View getView(final int position, View convertView, ViewGroup parent) {
final AppViewHolder holder;
viewposition=position;
if(convertView == null) {
convertView = mInflater.inflate(R.layout.row, null);
// creates a ViewHolder and stores a reference to the children view we want to bind data to
holder = new AppViewHolder();
holder.spiner=(Spinner)convertView.findViewById(R.id.spinner);
holder.offtext=(TextView)convertView.findViewById(R.id.off_txt);
holder.offTxt = (TextView) convertView.findViewById(R.id.off_txt);
holder.apptitleTxt = (TextView) convertView.findViewById(R.id.apptitle_txt);
Typeface typeface = Typeface.createFromAsset(_activity.getAssets(),"CHICM___.TTF");
holder.apptitleTxt.setTypeface(typeface);
holder.offTxt.setTypeface(typeface);
if(screenWidth>480){
holder.offTxt.setTextSize(30);
holder.apptitleTxt.setTextSize(30);
}
convertView.setTag(holder);
} else {
holder = (AppViewHolder) convertView.getTag();
}
holder.setTitle(mApps.get(position).getTitle(),mApps.get(position).getVersionName());
notifyDataSetChanged();
holder.offTxt.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
holder.spiner.performClick();
}
});
holder.spiner.setAdapter(dataAdapter);
holder.spiner.setOnItemSelectedListener(new OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> arg0, View arg1,int arg2, long arg3) {
spinerposition=arg2;
switch (spinerposition)
{
case 1:
holder.offtext.setText("None");
break;
case 2:
holder.offtext.setText("Entertainment");
break;
case 3:
holder.offtext.setText("Games");
break;
case 4:
holder.offtext.setText("News/Books");
break;
case 5:
holder.offtext.setText("Social Networking");
break;
case 6:
holder.offtext.setText("Utilities");
break;
case 7:
holder.offtext.setText("Texting");
break;
case 8:
holder.offtext.setText("Web Browsers");
break;
}
}
public void onNothingSelected(AdapterView<?> arg0) {
}
});
return convertView;
}
/**
* Sets the list of apps to be displayed.
*
* @param list the list of apps to be displayed
*/
public void setListItems(List<App> list) {
mApps = list;
}
/**
* A view holder which is used to re/use views inside a list.
*/
public class AppViewHolder {
private TextView mTitle = null;
private TextView apptitleTxt = null;
private TextView offTxt = null;
private Spinner spiner=null;
public TextView offtext;
/**
* Sets the text to be shown as the app's title
*
* @param title the text to be shown inside the list row
*/
public void setTitle(String title,String category) {
apptitleTxt.setText(title);
// offtext.setText(category);
}
}
}
holder.offtext의 제목이 올바르게 설정되지 않았습니까? 그렇다면 getView 메소드를 사용할 때마다 제목이 표시되지 않습니다. OnItemSelectedListener에서만 수행합니다. 그 때문에 얼마간 오래된 데이터가 표시됩니다. –
내 견해 좀 봐 http://stackoverflow.com/questions/6470089/why-did-the-listview-repeated-every-6th-item/41900575#41900575 – Sam