在Android的listview中滚动或添加和项时,按钮文本消失

在Android的listview中滚动或添加和项时,按钮文本消失,android,listview,scroll,listviewitem,Android,Listview,Scroll,Listviewitem,我使用的列表视图有问题。listview中的每个项目都有两个按钮,用户可以使用它们添加或删除每个参赛者的分数 问题是当我向列表视图添加一个新项目时,或者当滚动(在添加了至少一个项目后)时,代码会随机从一个或多个项目的按钮中取出文本 有谁能告诉我A)这是什么原因造成的?(B)如何解决 我已经包含了我认为相关的代码。如果你认为我需要在这里多放一些,请告诉我 我的适配器类: public class ContestantListAdapter extends BaseAdapter { private

我使用的列表视图有问题。listview中的每个项目都有两个按钮,用户可以使用它们添加或删除每个参赛者的分数

问题是当我向列表视图添加一个新项目时,或者当滚动(在添加了至少一个项目后)时,代码会随机从一个或多个项目的按钮中取出文本

有谁能告诉我A)这是什么原因造成的?(B)如何解决

我已经包含了我认为相关的代码。如果你认为我需要在这里多放一些,请告诉我

我的适配器类:

public class ContestantListAdapter extends BaseAdapter {
private ArrayList<ContestantItem> contestantList;
private LayoutInflater  layoutInflater;

public ContestantListAdapter(Context context, ArrayList<ContestantItem> contestantList){
    this.contestantList = contestantList;
    layoutInflater = LayoutInflater.from(context);
}
@Override
public int getCount(){
    return contestantList.size();
}
public View getView(int position, View convertView, ViewGroup parentView){
    ViewHolder viewHolder;
    if(convertView == null){
        convertView = layoutInflater.inflate(R.layout.contestant_row_layout,null);//null might need to be activity_main
        viewHolder = new ViewHolder();
        viewHolder.nameView = (TextView) convertView.findViewById(R.id.nameView);
        viewHolder.pointsView = (TextView) convertView.findViewById(R.id.pointsView);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder)convertView.getTag();
    }
    viewHolder.nameView.setText((contestantList.get(position).getName()));
    viewHolder.pointsView.setText(Integer.toString(contestantList.get(position).getPoints()));

    //get button position
    Button button =(Button) convertView.findViewById(R.id.Minus);
    button.setOnClickListener(minusListener);
    Button buttonPlus = (Button) convertView.findViewById(R.id.Plus);
    buttonPlus.setOnClickListener(addListener);
    return convertView;
}

private View.OnClickListener minusListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        View parentRow = (View) v.getParent();
        ListView listView = (ListView) parentRow.getParent();
        final int position = listView.getPositionForView(parentRow);
        ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
        int tmpPoints = tmpContestant.getPoints()-1;
        if(tmpPoints<0){tmpPoints=0;}
        tmpContestant.setPoints(tmpPoints);
        notifyDataSetChanged();
    }
};
private View.OnClickListener addListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        View parentRow = (View) v.getParent();
        ListView listView = (ListView) parentRow.getParent();
        final int position = listView.getPositionForView(parentRow);
        ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
        int tmpPoints = tmpContestant.getPoints()+1;
        tmpContestant.setPoints(tmpPoints);
        notifyDataSetChanged();
    }
};
static class ViewHolder {
    TextView nameView;
    TextView pointsView;
}
@Override
public Object getItem(int index){
    return contestantList.get(index);
}
@Override
public long getItemId(int index){
    return index;
}

//this method should add the contestent to the listView.  must know what position to add it in.
public void addItem(String name, int index){
    ContestantItem tempContestant = new ContestantItem();
    tempContestant.setName(name);
    tempContestant.setPoints(1);
    contestantList.add(index,tempContestant);
    notifyDataSetChanged();
}
. . .
公共类ListAdapter扩展了BaseAdapter{
私人阵列列表;
私人停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场停车场;
公共竞争者列表适配器(上下文上下文,ArrayList竞争者列表){
this.qualitivelist=qualitivelist;
layoutInflater=layoutInflater.from(上下文);
}
@凌驾
public int getCount(){
返回列表。size();
}
公共视图getView(int位置、视图转换视图、视图组父视图){
持票人持票人;
if(convertView==null){
convertView=LayoutFlater.inflate(R.layout.Competitor_row_layout,null);//null可能需要是活动主
viewHolder=新的viewHolder();
viewHolder.nameView=(TextView)convertView.findViewById(R.id.nameView);
viewHolder.pointsView=(TextView)convertView.findViewById(R.id.pointsView);
convertView.setTag(viewHolder);
}否则{
viewHolder=(viewHolder)convertView.getTag();
}
viewHolder.nameView.setText((竞争者列表.get(位置).getName());
viewHolder.pointsView.setText(Integer.toString(竞争者列表.get(位置).getPoints());
//获取按钮位置
Button Button=(Button)convertView.findViewById(R.id.减号);
setOnClickListener(minusListener);
Button buttonPlus=(Button)convertView.findViewById(R.id.Plus);
buttonPlus.setOnClickListener(addListener);
返回视图;
}
private View.OnClickListener minusListener=新视图。OnClickListener(){
@凌驾
公共void onClick(视图v){
View parentRow=(View)v.getParent();
ListView ListView=(ListView)parentRow.getParent();
最终int位置=listView.getPositionForView(父行);
竞争者项tmpContestant=(竞争者项)竞争者列表。获取(位置);
int tmpPoints=tmpContestant.getPoints()-1;

如果(tmpPoints我要说的是@Suhas Bachewar说过的话,并将一些东西与您拥有的代码结合在一起,因为您应该知道,您正在使用一个回收器让您的视图填充列表中的不同对象,为什么不在getView中包含单击事件,这样您就不必急于查找哪个pa关节按钮视图与必须增加其值的对象相关联

public View getView(int position, View convertView, ViewGroup parentView){
    ViewHolder viewHolder;
    if(convertView == null){
        convertView = layoutInflater.inflate(R.layout.contestant_row_layout,null);//null might need to be activity_main
        viewHolder = new ViewHolder();
        viewHolder.nameView = (TextView) convertView.findViewById(R.id.nameView);
        viewHolder.buttonMinus= (Button) convertView.findViewById(R.id.Minus);
        viewHolder.buttonPlus= (Button) convertView.findViewById(R.id.Plus);
        viewHolder.pointsView = (TextView) convertView.findViewById(R.id.pointsView);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder)convertView.getTag();
    }
    viewHolder.nameView.setText((contestantList.get(position).getName()));
    viewHolder.pointsView.setText(Integer.toString(contestantList.get(position).getPoints()));

    //get button position

    buttonMinus.setOnClickListener(minusListener);

    buttonPlus.setOnClickListener(addListener);
    return convertView;
}

private View.OnClickListener minusListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        View parentRow = (View) v.getParent();
        ListView listView = (ListView) parentRow.getParent();
        final int position = listView.getPositionForView(parentRow);
        ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
        int tmpPoints = tmpContestant.getPoints()-1;
        if(tmpPoints<0){tmpPoints=0;}
        tmpContestant.setPoints(tmpPoints);
        notifyDataSetChanged();
    }
};
private View.OnClickListener addListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        View parentRow = (View) v.getParent();
        ListView listView = (ListView) parentRow.getParent();
        final int position = listView.getPositionForView(parentRow);
        ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
        int tmpPoints = tmpContestant.getPoints()+1;
        tmpContestant.setPoints(tmpPoints);
        notifyDataSetChanged();
    }
};
static class ViewHolder {
    TextView nameView;
    TextView pointsView;
    Button buttonMinus;
    Button buttonPlus;
}
公共视图getView(int位置、视图转换视图、视图组父视图){ 持票人持票人; if(convertView==null){ convertView=LayoutFlater.inflate(R.layout.Competitor_row_layout,null);//null可能需要是活动主 viewHolder=新的viewHolder(); viewHolder.nameView=(TextView)convertView.findViewById(R.id.nameView); viewHolder.buttonMinus=(按钮)convertView.findViewById(R.id.减号); viewHolder.buttonPlus=(Button)convertView.findViewById(R.id.Plus); viewHolder.pointsView=(TextView)convertView.findViewById(R.id.pointsView); convertView.setTag(viewHolder); }否则{ viewHolder=(viewHolder)convertView.getTag(); } viewHolder.nameView.setText((竞争者列表.get(位置).getName()); viewHolder.pointsView.setText(Integer.toString(竞争者列表.get(位置).getPoints()); //获取按钮位置 buttonMinus.setOnClickListener(minusListener); buttonPlus.setOnClickListener(addListener); 返回视图; } private View.OnClickListener minusListener=新视图。OnClickListener(){ @凌驾 公共void onClick(视图v){ View parentRow=(View)v.getParent(); ListView ListView=(ListView)parentRow.getParent(); 最终int位置=listView.getPositionForView(父行); 竞争者项tmpContestant=(竞争者项)竞争者列表。获取(位置); int tmpPoints=tmpContestant.getPoints()-1;
如果(tmppoint在视图保持架内添加按钮与文本视图相同。@SuhasBachewar,你是对的,与特定的文本视图没有关系,因为视图保持架无法分辨单击了哪个按钮。他必须在视图保持架中同时包含加号和减号按钮。谢谢,我将这些按钮添加到了视图保持架中,它仍然随机地将按钮变为空白。我甚至在getView方法中设置按钮文本,我也遇到了同样的问题。我使用的是一款非常便宜的手机。这可能是因为主线程上发生了太多事情造成的吗?所以你解决了还是没有解决?如果是,那么你能给我指路吗?我已经很久没有记住具体的实现细节了。这个问题是由我引起的我制作了一个普通的java对象来保存列表中每个项目的状态,然后在onBindViewHolder中更新了viewHolder
public class MainActivity extends AppCompatActivity implements                           ContestantsFragment.OnFragmentInteractionListener{

ListView listView1;
ContestantListAdapter contestantAdapter;

@Override
protected void onCreate(Bundle savedInstanceState){
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    ArrayList<ContestantItem> rowDetails = getListData();

    listView1 = (ListView) findViewById(R.id.contactsListView);
    listView1.setAdapter(new ContestantListAdapter(this,rowDetails));
    contestantAdapter = (ContestantListAdapter) listView1.getAdapter();

}

private ArrayList getListData(){
    ArrayList<ContestantItem> contestantList = new ArrayList<ContestantItem>();
    ContestantItem cItem;
    for(int i=0;i<10;i++){
        cItem = new ContestantItem();
        cItem.setName("Danny Anderson");
        cItem.setPoints(5);
        contestantList.add(cItem);
    }
    return contestantList;
}

@Override
public void onFragmentInteraction(Uri uri) {

}
//if the name is found returns the index position in the list.  If not found -99
public void findAlphabetical(View view){
    //TODO implement Binary search algorithm.
    hideKeyboard();
    EditText tmpEditTxt = (EditText) findViewById(R.id.searchField);
    String inputTxt = tmpEditTxt.getText().toString();
    int findAtIndex =contestantAdapter.searchAlphabetical(inputTxt)-1;
    if(findAtIndex <0){findAtIndex=0;}
    listView1.smoothScrollToPosition(findAtIndex);
}
public void addInAlpabetOrder(View view){
    //TODO  add the name in alphabetical order
    hideKeyboard();
    //ListView tmpListView = (ListView) contestantsFragment.getView().findViewById(R.id.contactsListView);
    EditText tmpEditTxt = (EditText) findViewById(R.id.searchField);
    String inputTxt = tmpEditTxt.getText().toString();
    int addAtIndex =contestantAdapter.searchAlphabetical(inputTxt);
    contestantAdapter.addItem(inputTxt, addAtIndex);
    listView1.smoothScrollToPosition(addAtIndex);
}
public void clearContestantList(View view){
    //TODO clear out all contestants from the list
    contestantAdapter.clearAllItems();

}
. . .
public View getView(int position, View convertView, ViewGroup parentView){
    ViewHolder viewHolder;
    if(convertView == null){
        convertView = layoutInflater.inflate(R.layout.contestant_row_layout,null);//null might need to be activity_main
        viewHolder = new ViewHolder();
        viewHolder.nameView = (TextView) convertView.findViewById(R.id.nameView);
        viewHolder.buttonMinus= (Button) convertView.findViewById(R.id.Minus);
        viewHolder.buttonPlus= (Button) convertView.findViewById(R.id.Plus);
        viewHolder.pointsView = (TextView) convertView.findViewById(R.id.pointsView);
        convertView.setTag(viewHolder);
    }else{
        viewHolder = (ViewHolder)convertView.getTag();
    }
    viewHolder.nameView.setText((contestantList.get(position).getName()));
    viewHolder.pointsView.setText(Integer.toString(contestantList.get(position).getPoints()));

    //get button position

    buttonMinus.setOnClickListener(minusListener);

    buttonPlus.setOnClickListener(addListener);
    return convertView;
}

private View.OnClickListener minusListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        View parentRow = (View) v.getParent();
        ListView listView = (ListView) parentRow.getParent();
        final int position = listView.getPositionForView(parentRow);
        ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
        int tmpPoints = tmpContestant.getPoints()-1;
        if(tmpPoints<0){tmpPoints=0;}
        tmpContestant.setPoints(tmpPoints);
        notifyDataSetChanged();
    }
};
private View.OnClickListener addListener = new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        View parentRow = (View) v.getParent();
        ListView listView = (ListView) parentRow.getParent();
        final int position = listView.getPositionForView(parentRow);
        ContestantItem tmpContestant = (ContestantItem) contestantList.get(position);
        int tmpPoints = tmpContestant.getPoints()+1;
        tmpContestant.setPoints(tmpPoints);
        notifyDataSetChanged();
    }
};
static class ViewHolder {
    TextView nameView;
    TextView pointsView;
    Button buttonMinus;
    Button buttonPlus;
}