而滚动的动态生成单选按钮改变其位置 [英] Dynamically generated Radio button changes its position while scrolling
问题描述
我已经动态创建单选按钮。而它们显示相当不错,但是当我选择并滚动它失去了它的地位。我知道设置和获取与ViewHolder类标签转换和视图的方式。但是这一次,我有动态的ID,所以我不能标签ID。我曾尝试这样
converview.setTag(rdbtn.getId(),rdbtn);
但它抛出密钥必须是专用的资源ID
。
下面是我的自定义适配器类
静态类FeedBacksubmitionViewHolder {
TextView的保护问题;
受保护的EditText Cooment;
受保护的ViewGroup RadioGroup中;
保护的TextView Q;}
公共查看getView(INT位置,查看converview,父母的ViewGroup){
FeedBacksubmitionViewHolder viewHolder = NULL;
如果(converview == NULL){
LayoutInflater吹气= context.getLayoutInflater();
converview = inflater.inflate(R.layout.listfeedbacksubmitionquestion,空,真);
viewHolder =新FeedBacksubmitionViewHolder(); viewHolder.Question =(TextView中)converview.findViewById(R.id.tvFeedbacksubmitionquestion);
viewHolder.Cooment =(EditText上)converview.findViewById(R.id.edfeedbacksubmitioncomment);
viewHolder.Radiogroup =((ViewGroup中)converview findViewById(R.id.radiogroup));
viewHolder.Q =(TextView中)converview.findViewById(R.id.feedba1); LL的LinearLayout =新的LinearLayout(背景);
ll.setOrientation(LinearLayout.VERTICAL);
INT数= feedBackSubmitionOptionList.size(); //if(position!=feedBackSubmitionQuestionList.size()-1 ||)
的for(int i = 0; I<数;我++){
//if(ll.getChildAt(0).getId()!= feedBackSubmitionOptionList.get(ⅰ).getId()){
单选rdbtn =新的单选按钮(背景);
rdbtn.setId(feedBackSubmitionOptionList.get(ⅰ).getId());
rdbtn.setText(feedBackSubmitionOptionList.get(ⅰ).getOptionLabel());
ll.addView(rdbtn);
converview.setTag(rdbtn.getId(),rdbtn); //}
} converview.setTag(viewHolder);
converview.setTag(R.id.tvFeedbacksubmitionquestion,viewHolder.Question);
converview.setTag(R.id.edfeedbacksubmitioncomment,viewHolder.Cooment);
converview.setTag(R.id.radiogroup,viewHolder.Radiogroup);
converview.setTag(R.id.feedba1,viewHolder.Q); viewHolder.Radiogroup.addView(Ⅱ);
}其他{
viewHolder =(FeedBacksubmitionViewHolder)converview.getTag(); }
我这个问题最后的日子里挣扎,但这样做R&放大器; N有问题解决了。
你可以做这样的事情。
@覆盖
公共查看getView(最终诠释的立场,观点convertView,父母的ViewGroup){
// TODO自动生成方法存根//如果(位置== 0)// Toast.makeText(上下文,+ QuestionViewPageAdapter.mRadioGroupData,Toast.LENGTH_SHORT).show(); 最后ViewHolder viewHolder;
查看排= convertView; 单选按钮=新的单选按钮[的Integer.parseInt(mNoOfCategoryGreading)]; LayoutInflater气筒=LayoutInflater.from(context);//(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
行= inflater.inflate(R.layout.question_row,父母,假); viewHolder =新ViewHolder(); viewHolder.tv_qContent =(TextView中)row.findViewById(R.id.tv_question);
viewHolder.rg =(RadioGroup中)row.findViewById(R.id.rgrp); 的for(int i = 0; I<的Integer.parseInt(mNoOfCategoryGreading);我++)
{
单选按钮[i] =新的单选按钮(背景);
单选按钮[I] .setLayoutParams(新RadioGroup.LayoutParams(0,LayoutParams.WRAP_CONTENT,1F));
// 1F为layout_weight =1
RADIOBUTTON [I] .setId(ⅰ);
RADIOBUTTON [I] .setText(+第(i + 1)); viewHolder.rg.addView(单选[I]);
}
row.setTag(viewHolder);
的for(int i = 0; I< QuestionViewPageAdapter.mRadioGroupData.size();我++){
INT P =的Integer.parseInt(+ QuestionViewPageAdapter.mRadioGroupData.get(I)获得(位置));
字符串ID = QuestionViewPageAdapter.mRadioGroupData.get(I)获得(ID);
如果(P = - 1安培;!&安培; id.equals(+ data.get(位置)获得(AppData.question_Set_category_QuestionID)))
{//radioButton[p].setSelected(true);
viewHolder.rg.check(P-1);} // Toast.makeText(上下文,是+ P,Toast.LENGTH_LONG).show();} viewHolder.tv_qContent.setText((位置+ 1)+。 + data.get(位置)获得(AppData.question_Set_category_QuestionContent));
viewHolder.tv_qContent.setTypeface(typeface_muso_regular300); viewHolder.rg.setOnCheckedChangeListener(新OnCheckedChangeListener(){ @覆盖
公共无效onCheckedChanged(RadioGroup中组,诠释checkedId){
// TODO自动生成方法存根 字符串s = data.get(位置)获得(AppData.question_Set_category_QuestionID);
isAvailabel(多个);
INT radioButtonID = viewHolder.rg.getCheckedRadioButtonId();
查看单选按钮= viewHolder.rg.findViewById(radioButtonID);
INT IDX = viewHolder.rg.indexOfChild(单选)
HashMap的<字符串,字符串>地图=新的HashMap<字符串,字符串>();
map.put(位置,+(IDX + 1));
map.put(ID,+ data.get(位置)获得(AppData.question_Set_category_QuestionID));
map.put(类别ID,+ mCategoryId);
QuestionViewPageAdapter.mRadioGroupData.add(地图);
}
}); 返回行;
}私人无效isAvailabel(字符串QID){ 的for(int i = 0; I< QuestionViewPageAdapter.mRadioGroupData.size();我++){
如果(qId.equals(QuestionViewPageAdapter.mRadioGroupData.get(I)获得(ID))){
位置=我; QuestionViewPageAdapter.mRadioGroupData.remove(ⅰ);
}
}} 类ViewHolder {
TextView的tv_qContent,TV_1,tv_2,tv_3;
RadioGroup中RG;
单选rBtn1,rBtn2,rBtn3,rBtn4,rBtn5;
}
我无法删除code,是不是对你很重要得多。你必须学习code,我想你会得到的想法。
给予好评,如果我解决您的问题。
I have created dynamically Radio Buttons .And they are displayed quite well, but when I select and scroll it loses its position. I know the way of setting and getting the tag with ViewHolder class and convert view . but this time, I have dynamic ids, so I cant tag id . i have tried like this
converview.setTag(rdbtn.getId(),rdbtn);
But it throws The key must be an application specific Resource id
.
Here is my Custom Adapter Class
static class FeedBacksubmitionViewHolder {
protected TextView Question;
protected EditText Cooment;
protected ViewGroup Radiogroup;
protected TextView Q;
}
public View getView(int position,View converview,ViewGroup parent) {
FeedBacksubmitionViewHolder viewHolder = null;
if (converview ==null ){
LayoutInflater inflater=context.getLayoutInflater();
converview=inflater.inflate(R.layout.listfeedbacksubmitionquestion, null,true);
viewHolder = new FeedBacksubmitionViewHolder();
viewHolder.Question = (TextView) converview.findViewById(R.id.tvFeedbacksubmitionquestion);
viewHolder.Cooment = (EditText) converview.findViewById(R.id.edfeedbacksubmitioncomment);
viewHolder.Radiogroup=((ViewGroup)converview. findViewById(R.id.radiogroup));
viewHolder.Q =(TextView)converview.findViewById(R.id.feedba1);
LinearLayout ll = new LinearLayout(context);
ll.setOrientation(LinearLayout.VERTICAL);
int number = feedBackSubmitionOptionList.size();
//if(position!=feedBackSubmitionQuestionList.size()-1 || )
for (int i = 0; i < number; i++) {
//if(ll.getChildAt(0).getId()!=feedBackSubmitionOptionList.get(i).getId()){
RadioButton rdbtn = new RadioButton(context);
rdbtn.setId(feedBackSubmitionOptionList.get(i).getId());
rdbtn.setText(feedBackSubmitionOptionList.get(i).getOptionLabel());
ll.addView(rdbtn);
converview.setTag(rdbtn.getId(),rdbtn);
//}
}
converview.setTag(viewHolder);
converview.setTag(R.id.tvFeedbacksubmitionquestion,viewHolder.Question);
converview.setTag(R.id.edfeedbacksubmitioncomment,viewHolder.Cooment);
converview.setTag(R.id.radiogroup,viewHolder.Radiogroup);
converview.setTag(R.id.feedba1,viewHolder.Q);
viewHolder.Radiogroup.addView(ll);
}else{
viewHolder= (FeedBacksubmitionViewHolder)converview.getTag();
}
I struggled with this issue last days, but doing R&N got the issue solved. you can do something like this.
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub// if(position==0)//Toast.makeText(context, ""+QuestionViewPageAdapter.mRadioGroupData, Toast.LENGTH_SHORT).show();
final ViewHolder viewHolder;
View row=convertView;
radioButton=new RadioButton[Integer.parseInt(mNoOfCategoryGreading)]; LayoutInflater inflater =LayoutInflater.from(context);//(LayoutInflater)context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(R.layout.question_row, parent, false);
viewHolder=new ViewHolder();
viewHolder.tv_qContent=(TextView)row.findViewById(R.id.tv_question);
viewHolder.rg=(RadioGroup)row.findViewById(R.id.rgrp);
for(int i=0;i<Integer.parseInt(mNoOfCategoryGreading);i++)
{
radioButton[i]=new RadioButton(context);
radioButton[i].setLayoutParams(new RadioGroup.LayoutParams(0, LayoutParams.WRAP_CONTENT,1f));
//1f for layout_weight="1"
radioButton[i].setId(i);
radioButton[i].setText(""+(i+1));
viewHolder.rg.addView(radioButton[i]);
}
row.setTag(viewHolder);
for(int i=0;i<QuestionViewPageAdapter.mRadioGroupData.size();i++){
int p=Integer.parseInt(""+QuestionViewPageAdapter.mRadioGroupData.get(i).get("position"));
String id=QuestionViewPageAdapter.mRadioGroupData.get(i).get("Id");
if(p!=-1 && id.equals(""+data.get(position).get(AppData.question_Set_category_QuestionID)))
{//radioButton[p].setSelected(true);
viewHolder.rg.check(p-1);}//Toast.makeText(context, "Yes "+p, Toast.LENGTH_LONG).show();}viewHolder.tv_qContent.setText((position+1)+". "+data.get(position).get(AppData.question_Set_category_QuestionContent));
viewHolder.tv_qContent.setTypeface(typeface_muso_regular300);
viewHolder.rg.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
// TODO Auto-generated method stub
String s=data.get(position).get(AppData.question_Set_category_QuestionID);
isAvailabel(s);
int radioButtonID = viewHolder.rg.getCheckedRadioButtonId();
View radioButton = viewHolder.rg.findViewById(radioButtonID);
int idx = viewHolder.rg.indexOfChild(radioButton);
HashMap<String, String> map=new HashMap<String, String>();
map.put("position", ""+(idx+1));
map.put("Id", ""+data.get(position).get(AppData.question_Set_category_QuestionID));
map.put("CategoryId", ""+mCategoryId);
QuestionViewPageAdapter.mRadioGroupData.add(map);
}
});
return row;
}
private void isAvailabel(String qId){
for(int i=0;i<QuestionViewPageAdapter.mRadioGroupData.size();i++){
if(qId.equals(QuestionViewPageAdapter.mRadioGroupData.get(i).get("Id"))){
position=i;
QuestionViewPageAdapter.mRadioGroupData.remove(i);
}
}
}
class ViewHolder {
TextView tv_qContent ,tv_1,tv_2,tv_3;
RadioGroup rg;
RadioButton rBtn1,rBtn2,rBtn3,rBtn4,rBtn5;
}
I couldn't remove the code that is not much important for you. you have to study the code and i think you will get the idea. Upvote if i solve your issue.
这篇关于而滚动的动态生成单选按钮改变其位置的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!