【问题标题】:Android listview with button lost reference when clicked单击时带有按钮的Android列表视图丢失参考
【发布时间】:2017-06-09 05:49:02
【问题描述】:

我正在尝试在列表视图中编辑内容,但是当单击以更新某些项目时,其他位置也会更新。这些数据保存在 SQLite 数据库中。请看下面我的适配器

public View getView(int position, View convertView, ViewGroup parent) {
    View v = super.getView(position, convertView, parent);

    txtId = (TextView) v.findViewById(R.id.txtId);       
    txtValue = (TextView) v.findViewById(R.id.txtValue);
    ckb = (CheckBox) v.findViewById(R.id.ckbEnable);
    btnUpdate = (Button) v.findViewById(R.id.btnUpdate);


    final String id = list.get(position).get("id").toString();       
    final String value= list.get(position).get("value").toString();
    boolean bval = list.get(position).get("enbl").toString().equals("true") ? true : false;


    txtId.setText(id);
    txtValue.setText(value);
    ckb.setChecked(bval);

    btnUpdate.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            control = new DataControl(context);
            cal = new DataCal();
            cal.setId(id);               
            cal.setValue(txtValue.getText().toString());
            cal.setEnable(String.valueOf(ckb.isChecked()));
            int ctrl = control.editCal(cal);
            if (ctrl > 0)
                MessageBox("Success on updating");
            else
                MessageBox("Error while updating!");
        }
    });

    return v;

【问题讨论】:

标签: android


【解决方案1】:

尝试在您的适配器中使用“ViewHolder”类,希望它能解决您的所有问题。类似的东西:

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;



import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

 /**
 * Created by Zohaib Hassan on 11/28/2016.
 */

 public class InboxAdapter extends ArrayAdapter<InboxRow> {

 ArrayList<InboxRow> items;
 Context context;


 public InboxAdapter(Context context, int resource, ArrayList<InboxRow> items) {
super(context , resource , items);
this.context = context;
this.items = items;

}



@Override

public View getView(int position, View convertView, ViewGroup parent) {

// Get the data item for this position

InboxRow rowItem = getItem(position);

// Check if an existing view is being reused, otherwise inflate the view

ViewHolder viewHolder; // view lookup cache stored in tag

if (convertView == null) {

    viewHolder = new ViewHolder();

    LayoutInflater inflater = LayoutInflater.from(context);

    convertView = inflater.inflate(R.layout.inbox_row, null);

    viewHolder.tvUserName = (TextView) convertView.findViewById(R.id.tv_user_name_inbox);
    viewHolder.tvMessage = (TextView) convertView.findViewById(R.id.tv_message_inbox);
    viewHolder.tvTimeCount = (TextView) convertView.findViewById(R.id.tv_time_count_inbox);
    viewHolder.userProfilePic = (CircleImageView) convertView.findViewById(R.id.inbox_profile_image);

    convertView.setTag(viewHolder);

} else {

    viewHolder = (ViewHolder) convertView.getTag();

}


// Set Your data here!
/*CircleImageView ivProfileImage Set Background with Picasso*/

return convertView;

}

private static class ViewHolder {

TextView tvUserName , tvMessage , tvTimeCount;
CircleImageView userProfilePic;

}

}

【讨论】:

  • 我将设置数据放在哪里,在 else 子句中?
  • No not 在 else 子句中,在 if else 条件之后和 return 语句之前。我在代码中插入了一条注释。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 1970-01-01
相关资源
最近更新 更多