java - ListView不想刷新

标签 java android android-layout listview android-activity

我有一个问题,我有一项 Activity 和一个对话框 fragment 。当我单击对话框 fragment 中的按钮时,我将模型发送到 Activity 并将该模型写入列表。但是,当我向列表添加多个元素时,我的 ListView 重复第一个元素,我在 onCreate() 中初始化我的适配器,并在 onExcerciseAdd 中添加新信息:
Activity :

public class AddTrainingActivity extends ActionBarActivity implements ExcercisesFragment.onButtonAdd {
private ActionBarDrawerToggle toggle;
int DIALOG_TIME = 1;
int myHour = 00;
int myMinute = 00;
TextView tvTime;
Button btn_add_ex;
ListView list;
ExcerciseAdapter adapter;
ArrayList<ExcerciseModel> excercise_list;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_addtraining);
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    tvTime = (TextView) findViewById(R.id.tv_time_add);
    tvTime.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showDialog(DIALOG_TIME);
        }
    });
    btn_add_ex = (Button) findViewById(R.id.btn_add_exercise);
    list = (ListView) findViewById(R.id.list_excercise);
    excercise_list = new ArrayList<ExcerciseModel>();
    Log.d("onCreate", "Work!");
    adapter = new ExcerciseAdapter(excercise_list, this);
    btn_add_ex.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            ExcercisesFragment dlg = new ExcercisesFragment();
            dlg.show(getSupportFragmentManager(),"dlg");
        }
    });
}

protected Dialog onCreateDialog(int id) {
    if (id == DIALOG_TIME) {
        Calendar c = Calendar.getInstance();
        myHour = c.getTime().getHours();
        myMinute = c.getTime().getMinutes();
        TimePickerDialog tpd = new TimePickerDialog(this, myCallBack, myHour, myMinute, true);
        return tpd;
    }
    return super.onCreateDialog(id);
}

TimePickerDialog.OnTimeSetListener myCallBack = new TimePickerDialog.OnTimeSetListener() {
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        myHour = hourOfDay;
        myMinute = minute;
        if (myMinute < 10) {
            tvTime.setText(myHour + " : 0" + myMinute );
        } else {
            tvTime.setText(myHour + " : " + myMinute );
        }
        Log.d("TIME", "minutes " + myMinute);
    }
};


@Override
public void onExcerciseAdd(ExcerciseModel model) {
    Log.d("Adapter", "null? " + (adapter.isEmpty()));
    excercise_list.add(model);
    if (adapter.isEmpty()) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                adapter.notifyDataSetInvalidated();
                adapter.notifyDataSetChanged();
                list.invalidate();
                list.invalidateViews();
            }
        });

    }
    list.setAdapter(adapter);
    for (int i = 0; i < excercise_list.size(); i++){
        Log.d("List_ex", "list(" + i +"): " + excercise_list.get(i).getTitle().toString());
    }
}
}

对话框 fragment :

public class ExcercisesFragment extends DialogFragment {

private Button btn_add_dialog;
private EditText edit_time;
private EditText edit_count1;
private EditText edit_count2;
private EditText edit_weight;
private AutoCompleteTextView edit_ex;

public interface onButtonAdd {
    void onExcerciseAdd (ExcerciseModel model);

}

onButtonAdd button_add;

public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    getDialog().setTitle("Title!");
    View v = inflater.inflate(R.layout.fragment_add_excersise, null);
    btn_add_dialog = (Button) v.findViewById(R.id.btn_add_exercise_fr);
    edit_time = (EditText) v.findViewById(R.id.edit_ex_go);
    edit_count1 = (EditText) v.findViewById(R.id.edit_podh);
    edit_count2 = (EditText) v.findViewById(R.id.edit_repeat);
    edit_weight = (EditText) v.findViewById(R.id.edit_weight_add);
    edit_ex = (AutoCompleteTextView) v.findViewById(R.id.excercise_title);
    button_add = (onButtonAdd) getActivity();
    Resources res = getResources();
    String[] excersices = res.getStringArray(R.array.excersices);
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(getActivity(),
            R.layout.profile_item, R.id.item_autotext, excersices);
    adapter.setDropDownViewResource(android.R.layout.simple_dropdown_item_1line);
    edit_ex.setAdapter(adapter);
    edit_ex.setOnKeyListener(new View.OnKeyListener() {

        @Override
        public boolean onKey(View v, int keyCode, KeyEvent event) {
            if (keyCode == KeyEvent.KEYCODE_ENTER) {
                // Just ignore the [Enter] key
                return true;
            }
            // Handle all other keys in the default way
            return false;
        }
    });
    edit_ex.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            edit_ex.showDropDown();
        }
    });
    btn_add_dialog.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String time = edit_time.getText().toString();
            String title = edit_ex.getText().toString();
            String weight = edit_weight.getText().toString();
            String count1 = edit_count1.getText().toString();
            String count2 = edit_count2.getText().toString();
            if (title.equals("") || count1.equals("") || count2.equals("") || weight.equals("") || time.equals("")) {
                Toast.makeText(getActivity(),"Необходимо заполнить все поля", Toast.LENGTH_SHORT).show();
            } else {
                ExcerciseModel model = new ExcerciseModel();
                model.setTitle(edit_ex.getText().toString());
                model.setTime(Integer.parseInt(edit_time.getText().toString()));
                model.setPodh(Integer.parseInt(edit_count1.getText().toString()));
                model.setCount(Integer.parseInt(edit_count2.getText().toString()));
                model.setWeight(Integer.parseInt(edit_weight.getText().toString()));
                button_add.onExcerciseAdd(model);
                dismiss();
            }
        }
    });
    return v;
}
}

和适配器:

public class ExcerciseAdapter extends BaseAdapter {

ArrayList<ExcerciseModel> list;
Activity context;


public ExcerciseAdapter (ArrayList<ExcerciseModel> list, Activity context) {
    this.list = list;
    this.context = context;
}
@Override
public int getCount() {
    return list.size();
}

@Override
public Object getItem(int position) {
    return null;
}

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

private class ViewHolder {
    TextView txtViewTitle;
    TextView txtViewTime;
    TextView txtViewPodh;
    TextView txtViewCount;
    TextView txtViewWeight;
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    ViewHolder holder;
    LayoutInflater inflater = context.getLayoutInflater();
    Log.d("ConvertView", "convertview is null " + (convertView == null));
    if (convertView == null) {
        convertView = inflater.inflate(R.layout.list_item_ex, null);
        holder = new ViewHolder();
        holder.txtViewTitle = (TextView) convertView.findViewById(R.id.tv_adapter_title);
        holder.txtViewTime = (TextView) convertView.findViewById(R.id.tv_adapter_time_get);
        holder.txtViewPodh = (TextView) convertView.findViewById(R.id.tv_adapter_podh_get);
        holder.txtViewCount = (TextView) convertView.findViewById(R.id.tv_adapter_count_get);
        holder.txtViewWeight = (TextView) convertView.findViewById(R.id.tv_adapter_weight_get);
        holder.txtViewTitle.setText(list.get(position).getTitle().toString());
        holder.txtViewTime.setText(String.valueOf(list.get(position).getTime()));
        holder.txtViewPodh.setText(String.valueOf(list.get(position).getPodh()));
        holder.txtViewCount.setText(String.valueOf(list.get(position).getCount()));
        holder.txtViewWeight.setText(String.valueOf(list.get(position).getWeight()));
    } else {
        holder = (ViewHolder) convertView.getTag();
    }
    Log.d("Adapter", "List_size = " +list.size());
    Log.d("Adapter", "Title(" + position + "): " + list.get(position).getTitle().toString());
    return convertView;
}
}

我不知道,但是Adatper调用了太多次,当我添加一个元素时它调用了3次。请帮我解决这个问题。

最佳答案

您仅在创建列表项时更新它们。你应该做这样的事情:

LayoutInflater inflater = context.getLayoutInflater();
View view = (convertView == null)? inflater.inflate(R.layout.list_item_ex, parent, false) : convertView;

holder = new ViewHolder();
holder.txtViewTitle = (TextView) convertView.findViewById(R.id.tv_adapter_title);
holder.txtViewTime = (TextView) convertView.findViewById(R.id.tv_adapter_time_get);
holder.txtViewPodh = (TextView) convertView.findViewById(R.id.tv_adapter_podh_get);
holder.txtViewCount = (TextView) convertView.findViewById(R.id.tv_adapter_count_get);
holder.txtViewWeight = (TextView) convertView.findViewById(R.id.tv_adapter_weight_get);
holder.txtViewTitle.setText(list.get(position).getTitle().toString());
holder.txtViewTime.setText(String.valueOf(list.get(position).getTime()));
holder.txtViewPodh.setText(String.valueOf(list.get(position).getPodh()));
holder.txtViewCount.setText(String.valueOf(list.get(position).getCount()));
holder.txtViewWeight.setText(String.valueOf(list.get(position).getWeight())); 

return view;

此外,更改数据集时您不需要调用所有这些方法

    adapter.notifyDataSetInvalidated();
    adapter.notifyDataSetChanged();
    list.invalidate();
    list.invalidateViews();

调用adapter.notifyDataSetChanged();应该够了

您也不需要每次更改数据时都重置适配器,因此也可以删除此行

list.setAdapter(adapter);

关于java - ListView不想刷新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29309086/

相关文章:

java - 如何在不更改数据库架构的情况下将 UrlType 从 Hibernate 3.6 迁移到 4.3?

android - 快捷设置下拉菜单打开时有没有回调方法?

android - 将自定义 View (tileview)添加到布局?

android - 在不调用适配器上的 notifyItemChanged(int) 的情况下更新 RecyclerView 项目 ProgressBar

Android:根据屏幕尺寸以编程方式调整尺寸

java - 在 fragment 中使用 Google Places API 自动完成搜索栏

java - 使用 jxl api 将图像插入 Excel 单元格

java - 是否可以在多核计算机的单核上运行多线程应用程序?

android - Google Play 游戏服务 - 获取正在运行的比赛列表

android - Android 服务自动停止